一.什么是java反射
能通过一个类的名称创建这个类的对象,并且使用类中的方法和属性
二.为什么会有发射?使用反射有什么好处?
1.降低程序的耦合程度
2.用作框架:用框架是需要读取配置文件,通过配置文件,读取要用到的类的名称,然后通过反射得到他的方法,
为什么框架要用反射呢?因为框架设计者不知道你在用这个框架的时候用到什么jar包,什么类,所以要用到反射
下图是XML中的jar包配置
三.获取类的字节码
有三种方法:
1.Class<?> aClass = Class.forName(“reflection.Factory”);
2.Class stringClass = String.class;
3.Class<? extends String> aClass1 = new String().getClass();
可以通过字节码,创建一个这个类的对象
四.上代码
package reflection;
public class Factory {
public String sa = "adjahd";
private Factory reflection;
private int i = 3;
public Factory(){
System.out.println("Factory");
}
public Factory(String s){
System.out.println(s);
}
private Factory(int i2){
System.out.println(i2);
}
public static IBaoCaiMing getZhengxiongzhang(){
return new ZhengXiongZhang();
}
public static IBaoCaiMing getZhengyanggao(){
return new ZhengYangGao();
}
public void prient(){
System.out.println("这是方法");
}
private String gest(String saa){
System.out.println(saa);
return "我是返回值";
}
}
package reflection;
import org.junit.Test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ClassDome {
@Test
public void test1() throws Exception{
//加载类 得到的是类的字节码 三种方式
Class<?> aClass = Class.forName("reflection.Factory");
Class<String> stringClass = String.class;
Class<? extends String> aClass1 = new String().getClass();
System.out.println("--------------------构造函数----------------------");
//获取类的public构造函数,创建出对象
Constructor constructor = aClass.getConstructor(String.class);
Factory aa = (Factory) constructor.newInstance("jasfhja");
//获取类的private的构造函数,
Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(int.class);
declaredConstructor.setAccessible(true);//暴力访问
Factory o = (Factory) declaredConstructor.newInstance(3);
//只适用于无参的构造函数
Factory o1 = (Factory) aClass.newInstance();
System.out.println("--------------------属性----------------------");
//获取类的public属性
Field sa = aClass.getField("sa");
Object field = sa.get(o);
System.out.println(field);
//获取类的private的属性
Field reflection = aClass.getDeclaredField("reflection");
reflection.setAccessible(true);
Factory field1 = (Factory) reflection.get(o);
System.out.println(field1); //这只是引用并没有赋值
reflection.set(o,new Factory()); //给reflection属性赋值
System.out.println("--------------------方法----------------------");
//获取类的public方法
Method prient = aClass.getMethod("prient", null);
prient.invoke(o,null); //参数是一个对象 和 可变参数
//获取类的private方法、并获取返回值
Method gest = aClass.getDeclaredMethod("gest", String.class);
gest.setAccessible(true);
String mes = (String) gest.invoke(o, "mes");
System.out.println(mes);
}
}
运行结果
--------------------构造函数----------------------
jasfhja
3
Factory
--------------------属性----------------------
adjahd
null
Factory
--------------------方法----------------------
这是方法
mes
我是返回值