JAVA基础之反射
2019-07-10 本文已影响0人
衣锦昼行
1.通过反射获取类
获取反射对象(反射入口):Class
- 1.Class.forName(全类名)
try {
Class<?> Clazz1 = Class.forName("包名.类名");
}catch(ClassNotFoundException e){
e.printStackTrack();
}
2.类名.class
Class<?> Clazz2 = 类名.class;
3.对象.getClass()
类名 XXX = new 类名();
Class<?> Clazz3 = XXX.getClass();
2.获取公共方法
//class入口
Class<?> Clazz = null;
try {
Class<?> Clazz = Class.forName("包名.类名");
}catch(ClassNotFoundException e){
e.printStackTrack();
}
Method[] methods = Clazz.getMethods();//获取所有的公共方法(不仅是当前类,还有父类的方法)
Method[] declareMethods = Clazz.getDeclareMethods();//获取当前类的所有方法(1.只能是当前类 2.忽略访问修饰符限制)
3.获取所有的接口
//class入口
Class<?> Clazz = null;
try {
Class<?> Clazz = Class.forName("包名.类名");
}catch(ClassNotFoundException e){
e.printStackTrack();
}
Class<?>[] interfaces = Clazz.getInterfaces();
for(Class<?> inter:interfaces){
System.out.println(inter);
}
4.获取所有父类
//class入口
Class<?> Clazz = null;
try {
Class<?> Clazz = Class.forName("包名.类名");
}catch(ClassNotFoundException e){
e.printStackTrack();
}
Class<?> superclass = Clazz.getSuperclass();
System.out.println(superclass);
5.获取所有构造方法
//class入口
Class<?> Clazz = null;
try {
Class<?> Clazz = Class.forName("包名.类名");
}catch(ClassNotFoundException e){
e.printStackTrack();
}
Constructors<?>[] constructors = Clazz.getConstructors();
for(){}
6.获取所有的属性
//class入口
Class<?> Clazz = null;
try {
Class<?> Clazz = Class.forName("包名.类名");
}catch(ClassNotFoundException e){
e.printStackTrack();
}
Field[] fields = Clazz.getFields();//公共属性
Field[] declareFields = Clazz.getDeclareFields();//所有属性
7.获取当前反射所代表类(接口)的对象(实例)
Class<?> Clazz = null;
try {
Class<?> Clazz = Class.forName("包名.类名");
}catch(ClassNotFoundException e){
e.printStackTrack();
}
Object instance = Clazz.newInstance();
8.修改访问权限
//使用反射时,如果因为访问修饰符限制造成异常,可以通过
属性(方法).setAccessible(true);将属性或方法修改为可访问
方法的调用通过invoke();