反射1

来源:互联网 发布:淘宝设置公益宝贝 编辑:程序博客网 时间:2024/06/05 11:31

什么是反射机制重点内容
反射就是获取到该类的字节码文件对象,Class类对象,Class类就代表了该类的字节码对象,通过Class类对象获取该类里面的一些属性(成员变量),构造方法成员方法
面试题: 重点*
如何获取类的字节码文件对象,并且有几种方式呢?
1)Object类中的getClass()方法,表示正在运行的那个类:Class类
2)数据类型的class属性 举例:String.class,Student.class
3)Class类中的特有方法:forName(String className):重点 常用
public static Class< ?> forName(String className):获取字节码文件对象

开发中常使用的方式,因为第三种里面的参数是一个字符串…,字符串的内容是一个类的全路径名称(包名+类名)

Person p1=new Person();   Class class1 = p1.getClass();   Person p2=new Person();   Class class2 = p2.getClass();  Class class3= Person.class;  System.out.println(class1==class2);//true  System.out.println(class1==class3);//true  因为Person的Class文件只有一个 得到的Class对象也一定相同

使用的Person类

public class Person {private String name;public int age;private String address;Person(){}public Person(String name) {    super();    this.name = name;}public Person(String name, int age, String address) {    super();    this.name = name;    this.age = age;    this.address = address;} private Person(int age,String address){     this.address=address;     this.age=age; }@Overridepublic String toString() {    return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";}  public void show(){     System.out.println("无参show"); } public void show(String name){     System.out.println(name); } private  String getMessage(){     return "hello"; }}

说明 :Person的全路径名字 org.westos.reflect_01.Person
Class对象的方法
1获得构造器对象Constructor
public Constructor< T> getConstructor(Class

    //获得代表Person类字节码文件的类对象      Class class1 = Class.forName("reflect.Person"); //获得Person类的构造器对象 该构造对象有一个参数 类似于 Person(String name)      Constructor con=class1.getConstructor(String.class);      //通过构造器对象创建实例      //相当于Person p=new Person("王帅");      Object object = con.newInstance("王帅");      System.out.println(object);//Person [name=王帅, age=0, address=null]    }

实例2 获得非Public型的构造并创造出对象

        Class class1 = Class.forName("reflect.Person");        //通过此方法获得的构造对象,可以使任意权限修饰的        Constructor con=class1.getDeclaredConstructor(int.class,String.class);        con.setAccessible(true);//必须设置为true 不然private的修饰无权限访问        //会有java.lang.IllegalAccessException:异常        Object object = con.newInstance(20,"王帅");        System.out.println(object);//Person [name=null, age=20, address=王帅]

2获得对象属性的方法
获取所有的公共的成员变量public Field[] getFields():
所有的公共的可访问的字段,返回的是Field对象数组
public Field[] getDeclaredFields():获取当前字节码文件对象中所有的公共的或者私有的字段
提示:Field代表的是对象的属性对象
对象输出内容是:public java.lang.String org.westos.reflect_01.Person.address
获取单个属性对象
public Field getField(String name):获取公共的指定的字段
就是指定获取名字为什么的属性对象 如:参数为当前成员变量名称”address”,就获得了代表address的属性对象
对象属性的方法:public void set(Object obj, Object value)
就是把某个属性和具体的对象绑定,为某一个对象属性赋值
Field addressFiled = c.getField(“address”) ;
addressFiled.set(obj, “北京”) ;为obj对象的address赋值 北京
实例3 为对象的属性赋值

    Class class1 = Class.forName("reflect.Person");        //获取无参构造对象        Constructor con=class1.getDeclaredConstructor();        Object object = con.newInstance();        //分别获得 age 和address的属性对象        Field agefield = class1.getDeclaredField("age");        Field addressfield = class1.getDeclaredField("address");        //因为address是private的所以 要设置可见         addressfield.setAccessible(true);        //把age 和address的属性对象绑定到指定的对象 object        addressfield.set(object, "北京");        agefield.set(object, 20);        System.out.println(object);//Person [name=null, age=20, address=北京]

3获取成员方法Method对象
public Method getMethod(String name,Class

Class class1 = Class.forName("reflect.Person");        Constructor con=class1.getDeclaredConstructor();        Object object = con.newInstance();        //得到方法名字为show方法对象 该方法参数类型是String        Method  m=class1.getDeclaredMethod("show", String.class);        //调用show方法 传递hello参数  自动就输出 hello          m.invoke(object, "hello");//输出结果 hello

实例5 得到无参private方法对象并且调用该方法

        Class class1 = Class.forName("reflect.Person");        Constructor con=class1.getDeclaredConstructor();        Object object = con.newInstance();        //得到方法名字为show方法对象 该方法没有参数        Method  m=class1.getDeclaredMethod("show");        //调用show方法  设置显示可见        m.setAccessible(true);         m.invoke(object);//无参show
原创粉丝点击