• java反射


    反射机制:

       在运行状态中   对于任意一个类,都能够知道这个类的所有的属性和方法

    获取class 的三种方式:

      1、    Class    clazz1 = Class.forName("com.heima.bean.Person");         //    Class  的静态方法   通过全类名  获取运行类

      2、    Class clazz2 = Person.class;                                                          // 通过.class文件 

      3、   Person p = new Person();               Class clazz3 = p.getClass();    // Object的getClass()方法

    反射如何拿到构造方法:
            clazz.newInstance()        //只能拿空参              
            
            Class clazz = Class.forName("com.heima.bean.Person");           
            Constructor c = clazz.getConstructor(String.class,int.class);       //拿有参构造的对象  :  先获取类Class对象 ,然后用getConstructor(参数) 
    public class demon3_reflect {
    
        public static void main(String[] args) throws Exception {
            Class clazz = Class.forName("com.heima.bean.Person");
            Constructor c = clazz.getConstructor(String.class,int.class);
            Person p = (Person) c.newInstance("张三",23);
            System.out.println(p);
        }
    
    }
    public class demon2_reflect {
    
        public static void main(String[] args) throws Exception {
            Juicer j = new Juicer();
            BufferedReader br = new BufferedReader(new FileReader("config.properity"));   //  读取配置文件中的全类名(带包名的类名)     再用forName()  反射获取类
            Class clazz = Class.forName(br.readLine());    
            fruit f = (fruit)clazz.newInstance();         //   获取到空参构造      父类引用指向子类对象
            j.run(f);
        }
    }
    
    interface fruit {
        public abstract void squeeze();
        
    }
    class Apple implements fruit{
        public void squeeze() {
            System.out.println("炸出一杯苹果汁");
        }
    }
    
    class Orange implements fruit{
        public void squeeze() {
            System.out.println("炸出一杯juzi汁");
        }
    }
    
    class Juicer {
        public void run(fruit f) {
            f.squeeze();
        }
    }

    通过反射 获取成员变量并使用

    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    
    import com.heima.bean.Person;
    
    public class demon4_field {
        /*
         * 反射 获取成员变量
          Field f = clazz.getField("变量名")
          f.set(对象名,变量名) // 改变变量值
          如果 该变量被私有了,可以先 f.setAccessible(true) ,在调用set() 暴力反射 */ public static void main(String[] args) throws Exception { Class clazz = Class.forName("com.heima.bean.Person"); // 获取类对象 Constructor c = clazz.getConstructor(String.class,int.class);   // clazz.getContructor(参数) 获取有参构造对象 Person p = (Person) c.newInstance("张三",23);       // 通过有参构造,创建类对象 /*Field f = clazz.getField("name"); f.set(p, "李四");*/ Field f = clazz.getDeclaredField("name"); f.setAccessible(true);      // 暴力反射  f.set(p, "李四"); System.out.println(p); } }

    获取方法:

    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;
    
    import com.heima.bean.Person;
    
    public class demon5_method {
    
        public static void main(String[] args) throws Exception {
            Class clazz = Class.forName("com.heima.bean.Person");        
            Constructor c = clazz.getConstructor(String.class,int.class);
            Person p = (Person) c.newInstance("张三",23);
            Method m = clazz.getMethod("eat");       //获取eat方法
            m.invoke(p);
            
            Method m2 = clazz.getMethod("eat", int.class);    //  获取带参数的 eat()方法
            m2.invoke(p, 2);
        }
    
    }
    竹杖芒鞋轻胜马,一蓑烟雨任平生。 回首向来萧瑟处,也无风雨也无晴。
  • 相关阅读:
    java添加后台缓存
    Acunetix WVS安全测试软件使用教程(入门级)
    spring mvc + ajax上传文件,页面局部刷新
    github新手使用教程
    Junit使用方法
    反射(动态代理)
    TCP--文件上传
    网络编程--UDP通讯
    线程实现计时器,多线程间通信
    序列流
  • 原文地址:https://www.cnblogs.com/yaobiluo/p/11359866.html
Copyright © 2020-2023  润新知