java反射

ε祈祈猫儿з 提交于 2019-11-27 10:35:36

反射机制:

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

获取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);
    }

}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!