1 什么是反射
反射就是将java类中的所有东西映射成一个个java对象,在运行状态下,对于任意一个类,都能知道这个类中的所有属性和方法,,对于任意一个对象,都能调用它的任意一个方法和属性,这种动态获取信息以及动态嗲用方法的功能是java反射机制。
2 三种方式
- 类名.class
- 对象.getClass()
- 通过全类名 Class.forName("全类名")
3 例子
public static void main(String[] args) {
//类名获取
Class cla = TXtFlyzAjjbxx.class;
Field[] declaredFields = cla.getDeclaredFields();
System.out.println(123);
//对象获取
TXtFlyzAjjbxx tXtFlyzAjjbxx = new TXtFlyzAjjbxx();
Class aClass = tXtFlyzAjjbxx.getClass();
Method[] method = aClass.getMethods();
//全类名
try {
Class<?> aClass1 = Class.forName("com.hzc.xtzj.model.flyz.TXtFlyzAjjbxx");
Field[] declaredFields1 = aClass1.getDeclaredFields();
;
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//字符串的例子
Class clazz = null;
clazz = String.class;
clazz = "javaTest".getClass();
try {
clazz = Class.forName("java.lang.String");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println();
}
newInstance()方法
Class<? extends TXtAjGyNode> cla1 = TXtFlyzAjjbxx.class;
TXtAjGyNode o = cla1.newInstance();
Field[] declaredFields1 = cla1.getDeclaredFields();
类加载器 classloader
//系统类加载器
ClassLoader cla = ClassLoader.getSystemClassLoader();
System.out.println(cla);
//系统的父类加载器(扩展加载器)
System.out.println(cla.getParent());
//扩展加载器的父类加载器(不可获取)
System.out.println(cla.getParent().getParent());
//当前类 属于系统加载器加载
Class<XtzjApplicationTests> xtzjApplicationTestsClass = XtzjApplicationTests.class;
System.out.println(xtzjApplicationTestsClass.getClassLoader());
//Object 属于哪个加载器 引导类 看不到
Class<Object> objectClass = Object.class;
System.out.println(objectClass.getClassLoader());
Class 是一个描述类的类 封装了描述方法的 method 描述字段的filed 描述构造器的constructor
反射调用方法注意
在使用invoke调用方法时 若是私有方法
//私有方法的执行,必须在调用invoke之前加上一句method.setAccessible(true);
注解 @interface
public class test {
@wodezhujie
public void test() {
System.out.println("testzhxingh");
}
public void test2() {
System.out.println("test2222zhxingh");
}
public static void main(String[] args) {
Class<test> testClass = test.class;
Method[] methods = testClass.getMethods();
for (Method m : methods) {
boolean annotationPresent = m.isAnnotationPresent(wodezhujie.class);
if (annotationPresent){
try {
m.invoke(testClass.newInstance(),null);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}
}
}