zoukankan      html  css  js  c++  java
  • 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);
        }
    
    }
    竹杖芒鞋轻胜马,一蓑烟雨任平生。 回首向来萧瑟处,也无风雨也无晴。
  • 相关阅读:
    .NET:CLR via C# The CLR’s Execution Model
    VisualStudio:WEB 性能测试和负载测试 入门
    Maven:Maven 入门
    技术人生:东莞之行
    技术人生:新的生活计划
    Java:使用 Java 开发的一个异常处理框架
    .NET:命令行解析器介绍
    技术人生:希望有生之年开发一个“自己的解释语言”
    .NET:异常处理的两条“黄金定律”,求批!
    FAQ:Domain Event 和 C# 中的 Event 有啥区别?
  • 原文地址:https://www.cnblogs.com/yaobiluo/p/11359866.html
Copyright © 2011-2022 走看看