反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
//定义一个实体类
public class Test1 {
private int i;
private String str;
private int dou;
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
public String toString()
{
return str+" "+dou+" "+i;
}
public String getstr(String s,String s1)
{
return s+" "+s1;
}
public Test1(int i, String str, int dou) {
super();
this.i = i;
this.str = str;
this.dou = dou;
}
public int getDou() {
return dou;
}
public void setDou(int dou) {
this.dou = dou;
}
public Test1() {
super();
}
}
//获得对象(有三种方式)
Test1 te=new Test1();
//Class<? extends Test1> class1 = te.getClass();//通过对象名访问
Class<?> forName = Class.forName("test.Test1");//通过包名.类名
//Class<? extends Class> class2 = Test1.class.getClass();//通过类名
//得到构造方法的集合
Constructor<?>[] constructors = forName.getConstructors();
for (Constructor<?> cou : constructors) {
System.out.println(cou);
}
运行结果:
public test.Test1()
public test.Test1(int,java.lang.String,int)
//创建无参数构造方法
Constructor<?> cou = forName.getConstructor();
cou.newInstance();
//创建有参数的构造方法
Constructor<?> cou1 = forName.getConstructor(int.class,String.class,int.class);
cou1.newInstance(1,"23asdf",2);
也是获得同样的结果
public test.Test1()
public test.Test1(int,java.lang.String,int)
//获得属性(有两种方式)
//1,新建一个实例
Test1 nc2 = (Test1) forName.newInstance();
nc2.setDou(321);
nc2.setI(123);
nc2.setStr("123asdf");
//2,通过得到每一个属性
Field i = forName.getDeclaredField("i");
Field str = forName.getDeclaredField("str");
Field dou = forName.getDeclaredField("dou");
i.setAccessible(true);//true可以更改
str.setAccessible(true);
dou.setAccessible(true);
i.set(te, 123);
str.set(te, "123");
dou.set(te, 12);
//得到方法
Test1 nc3 = (Test1) forName.newInstance();
Method method = forName.getMethod("getstr",String.class,String.class);//方法名称和参数字节码
Object inv = method.invoke(nc3, "123","abc");
System.out.println(inv);
结果
123 abc