1.
反射就是把Java类中的各种成分映射成一个个的java对象。例如,一个类有:成员变量,方法,构造方法,包等等信息,利用反射技术可以对一个类进行解剖,
把各个组成部分映射成一个个对象。
2
三种获得class文件的方法
类名.class, 对象.getClass() Class.forName(“类名”)
//方法1
Class clazz1=cn.example.People.class;
//方法2
Class clazz2=Class.forName("cn.example.People");
//方法3
People p=new People();
Class clazz3=p.getClass();
3
通过反射获取对象
package cn.example; public class People { String name; public People(){ System.out.println("People"); } public People(String name){ this.name=name; System.out.println("People(name)"); } }
package cn.example; import java.lang.reflect.Constructor; import org.junit.Test; public class Demo { @Test public void test() throws Exception{ Class clazz2=Class.forName("cn.example.People"); Constructor c=clazz2.getConstructor(String.class); People p=(People) c.newInstance("张三"); System.out.println(p.name); } }
People(name)
张三
4 Constructor
得到某个类所有的构造方法:
5暴力访问
x.setAccessible(true);
这样可以得到私有的方法和属性,但之前要用getDeclare****;
6得到方法,字段,设置字段
package cn.example; public class People { private String name; public People(){ System.out.println("People"); } public People(String name){ this.name=name; System.out.println("People(name)"); } public void print() { System.out.println("my name is"+name); } }
package cn.example; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import org.junit.Test; public class Demo { @Test public void test() throws Exception{ People p=new People("李四"); Class clazz2=Class.forName("cn.example.People"); Field f=clazz2.getDeclaredField("name"); f.setAccessible(true); //获取字段 Object obj=f.get(p); //获取字段类型 Class Type=f.getType(); //打印字段值 if(Type.equals(String.class)){ String str=(String)obj; System.out.println(str); } //设置字段 f.set(p, "王五"); //System.out.println((String)f.get(p)); //获取方法 Method m=clazz2.getMethod("print",null); //调用方法 m.invoke(p, null); }
People(name)
李四
my name is王五