• java基础---反射得到属性方法及调用(1)


    --反射应用

    package com.part1;
    /**
     * 
     * @author pc
     *
     */
    public class Student {
        public int sid;
        public char sex;
        private String sname;
        private String password;
        private String cardno;
        private double money;
        
        public Student() {
        }
        public Student(int sid, String sname, String password, String cardno,
                double money) {
            this.sid = sid;
            this.sname = sname;
            this.password = password;
            this.cardno = cardno;
            this.money = money;
        }
        public int getSid() {
            return sid;
        }
        public void setSid(int sid) {
            this.sid = sid;
        }
        public String getSname() {
            return sname;
        }
        public void setSname(String sname) {
            this.sname = sname;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public String getCardno() {
            return cardno;
        }
        public void setCardno(String cardno) {
            this.cardno = cardno;
        }
        public double getMoney() {
            return money;
        }
        public void setMoney(double money) {
            this.money = money;
        }
        
        public char getSex() {
            return sex;
        }
        public void setSex(char sex) {
            this.sex = sex;
        }
        
        private void eat(String str){
            System.out.println("中午吃了一份:"+str);
        }
        
        @Override
        public String toString() {
            return "Student [cardno=" + cardno + ", money=" + money + ", password="
                    + password + ", sex=" + sex + ", sid=" + sid + ", sname="
                    + sname + "]";
        }
    
    }
    student
    package com.part1;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    /**
     * 1.获取Class对象,获取public属性和方法
     * @author pc
     *
     */
    public class Test {
        public static void main(String[] args) throws ClassNotFoundException, SecurityException, NoSuchFieldException, NoSuchMethodException {
            //1.获取Class对象
            //1.1 第一种获取Class对象方法:对象名.getClass()
            Student stu=new Student(1, "李震东", "123", "3201121990", 47.5);
            Class<Student> cla1=(Class<Student>) stu.getClass();
            System.out.println(cla1);
            
            //1.2 第二种获取Class对象的方法:类名.class;
            Class<Student> cla2=Student.class;
            System.out.println(cla2);
            
            //1.3 第三种获取Class对象的方法:
            Class<Student> cla3=(Class<Student>) Class.forName("com.part1.Student");
            System.out.println(cla3);
            
            //2.获取属性
            //2.1先获取所有public属性
            System.out.println("--------2.1先获取所有public属性---------");
            Field[] fields1=cla1.getFields();
            for (Field field : fields1) {
                System.out.println(field);
            }
            //2.2 获取某个属性
            System.out.println("---------2.2获取某个属性---------");
            Field field2 =cla2.getField("sex");
            System.out.println(field2);
            
            //3.获取方法
            //3.1 获取所有的public方法
            System.out.println("------3.1 获取所有的public方法------");
            Method[] methods=cla1.getMethods();
            for (Method method : methods) {
                System.out.println(method);
            }
            
            //3.2 获取某个public方法
            System.out.println("---------3.2 获取某个public方法---------");
            Method method2=cla2.getMethod("setSname", String.class);
            System.out.println(method2);
            
            
            
            
            
    
        }
    
    }
    Test得到属性和方法
    package com.part1;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    /**
     * 2.对于public修饰属性和方法操作:
     * 动态创建对象
     * 动态调用属性
     * 动态给属性赋值
     * 动态调用方法
     * @author pc
     *
     */
    public class Test2 {
        public static void main(String[] args) throws InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
            //1.获取Class对象
            Class cla=Student.class;
            
            //2.动态创建对象(卧底身份)
            //2.1 通过无参构造创建对象
            Student stu1=(Student) cla.newInstance();
            System.out.println("通过无参构造创建对象动态创建对象:"+stu1);
            
            //2.2 通过有参数构造创建对象
            //2.2.1 获取有参数构造
            Constructor conn=cla.getConstructor(int.class,String.class,String.class,String.class,double.class);
            
            //2.2.2 通过有参数的构造方法创建对象
            Student stu2=(Student) conn.newInstance(1,"东东","123","3201121990",45.5);
            System.out.println("通过有参数构造创建对象:"+stu2);
            
            //3.动态调用属性并给属性赋值
            //3.1 动态调用属性
            Field sexField=cla.getField("sex");
            
            //3.2 动态给属性赋值
            sexField.set(stu1, '女');
            
            //3.3 动态获取属性值
            System.out.println("sex属性值为:"+sexField.get(stu1));
            
            //4.动态获取方法并动态调用方法
            //4.1 动态获取某个公共方法
            Method setMoneyMethod=cla.getMethod("setMoney", double.class);
            
            //4.2 动态调用方法(※)
            setMoneyMethod.invoke(stu1, 9999.99);
            System.out.println(stu1);
        }
    
    }
    Test 调用
    package com.part1;
    
    import java.lang.reflect.Field;
    
    /**
     * 3.操作私有的属性
     *
     */
    public class Test3 {
        public static void main(String[] args) throws ClassNotFoundException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException, InstantiationException {
            //1.获取Class对象
            Class cla=Class.forName("com.part1.Student");
    
            //2.通过反射的无参数的构造创建对象
            Student stu=(Student) cla.newInstance();
            
            //3.获取私有属性
            //3.1获取所有属性和访问修饰符无关
            System.out.println("----3.1获取所有私有属性------");
            Field[] fields=cla.getDeclaredFields();
            for (Field field : fields) {
                System.out.println(field);
            }
            //3.2获取某个属性和访问修饰符无关
            System.out.println("----3.2获取某个属性和访问修饰符无关------");
            Field moneyfield=cla.getDeclaredField("money");
            System.out.println(moneyfield);
            
            //3.3给属性解除私有权限
            moneyfield.setAccessible(true);
            
            //3.4 给私有属性赋值
            moneyfield.set(stu, 9999.99);
            
            //3.5 获取私有属性值
            System.out.println(moneyfield.get(stu));
                
                
        }
    
    }
    Test操作私有的属性
    package com.part1;
    
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    /**
     * 4.操作私有方法并调用私有方法
     */
    public class Test4 {
        public static void main(String[] args) throws InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
            //1.获取Class对象
            Class<Student> cla=Student.class;
            
            //2.通过Class对象反射创建Student对象
            Student stu=cla.newInstance();
            System.out.println(stu);
            
            //3.获取所有方法和访问修饰符无关
            System.out.println("-------获取所有方法和访问修饰符无关-----------");
            Method[] methods=cla.getDeclaredMethods();
            for (Method method : methods) {
                System.out.println(method);
            }
            
            //4.获取某个私有的方法
            Method eatMethod=cla.getDeclaredMethod("eat", String.class);
            System.out.println("获取某个私有方法:"+eatMethod);
            
            //5.解除私有方法权限
            eatMethod.setAccessible(true);
            
            //6.调用私有方法并传入实参
            System.out.println("----------调用私有方法----------");
            eatMethod.invoke(stu, "快餐");
     
        }
    
    }
    Test调用私有

     使用反射调用方法时执行效率比较 正常调用、安全检查调用、不执行安全检查调用

    package com.bdqn.service;
    
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class Demo1 {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException{
          //不执行安全检查比执行安全检查效率高4倍   test3用时-1288ms
          test3();
          //执行安全检查速度最慢        test2用时-4890ms
          test2();
          //效率是不执行安全检查的30倍,是执行安全检查的120倍    test1用时-413ms
          test1();
    }
    
     private static void test1(){
      Emp  emp=new Emp();
      long startTime=System.currentTimeMillis();
       for (int i = 0; i <1000000000L; i++) {
        emp.getEmpName();
       }
       
       long endTime=System.currentTimeMillis();
        System.out.println("test1用时"+(startTime-endTime)+"ms");
       
        
       
     }
     private static void test2() throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException{
         Class<Emp> emp1=Emp.class;
         Emp emp=emp1.newInstance();
         Method method=emp1.getDeclaredMethod("getEmpName", null);
         long startTime=System.currentTimeMillis();
         for (int i = 0; i <1000000000L; i++) {
            method.invoke(emp, null);
         }
         long endTime=System.currentTimeMillis();
         System.out.println("test2用时"+(startTime-endTime)+"ms");
     }
     private static void test3()throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException{
         Class<Emp> emp1=Emp.class;
          Emp emp=emp1.newInstance();
         Method method=emp1.getDeclaredMethod("getEmpName", null);
         //不需要执行访问检查
         method.setAccessible(true);
         long startTime=System.currentTimeMillis();
         for (int i = 0; i <1000000000L; i++) {
            method.invoke(emp, null);
         }
         long endTime=System.currentTimeMillis();
         System.out.println("test3用时"+(startTime-endTime)+"ms");
     }
    }
    compare

    package com.bjsxt.test;
    
    import java.lang.reflect.Method;
    import java.lang.reflect.ParameterizedType;
    import java.lang.reflect.Type;
    import java.util.List;
    import java.util.Map;
    
    
    /**
     * 通过反射获取泛型信息
     * @author dell
     *
     */
    public class Demo1 {    
        public void test01(Map<String,User> map,List<User> list){
            System.out.println("Demo04.test01()");
        }    
        public Map<Integer,User> test02(){
            System.out.println("Demo04.test02()");
            return null;
        }    
        public static void main(String[] args) {
            try {            
                //获得指定方法参数泛型信息
                Method m = Demo1.class.getMethod("test01", Map.class,List.class);
                //调用时参数方法
                Type[] t = m.getGenericParameterTypes();
                for (Type paramType : t) {
                    System.out.println("#"+paramType);
                    if(paramType instanceof ParameterizedType){
                        Type[] genericTypes = ((ParameterizedType) paramType).getActualTypeArguments();
                        for (Type genericType : genericTypes) {
                            System.out.println("泛型类型:"+genericType);
                        }
                    }
                }            
                //获得指定方法返回值泛型信息
                Method m2 = Demo1.class.getMethod("test02", null);
                //调用的是返回的类型方法
                Type returnType = m2.getGenericReturnType();
                if(returnType instanceof ParameterizedType){
                        Type[] genericTypes = ((ParameterizedType) returnType).getActualTypeArguments();
    
                        for (Type genericType : genericTypes) {
                            System.out.println("返回值,泛型类型:"+genericType);
                        }                    
                }        
                
            } catch (Exception e) {
                e.printStackTrace();
            }    
        }
    }
     class User {
    }
    
    #java.util.Map<java.lang.String, com.bjsxt.test.User>
    泛型类型:class java.lang.String
    泛型类型:class com.bjsxt.test.User
    #java.util.List<com.bjsxt.test.User>
    泛型类型:class com.bjsxt.test.User
    返回值,泛型类型:class java.lang.Integer
    返回值,泛型类型:class com.bjsxt.test.User
    Demo5
  • 相关阅读:
    思科模拟器——常用命令
    思科模拟器——允许远程telnet连接控制路由器/交换机
    思科模拟器——使用路由器分割局域网
    如何将centos7作为DNS服务器
    Centos7设置grub密码保护
    curl提示不支持https协议解决方法
    Kettle入门--作业和转换的使用
    oracle命令导入SQL脚本
    centos7 部署elasticsearch
    Nginx通过Keepalived实现高可用
  • 原文地址:https://www.cnblogs.com/ou-pc/p/7170099.html
Copyright © 2020-2023  润新知