反射就是把java中的各种成分映射成一个个的java对象
1. Class对象:class类的实例表示正在运行的java应用程序中的类和接口。所有具有相同元素类型和维数的数组都共享改Class对象
获取Class对象有三种方式
(1)通过实例变量的getClass()方法
Class cl=new String(“abc”).getClass();
(2)通过Class类的静态方法--forName()来实现
Class class=Class.forName(className);
(3)使用类字面常量或TYPE字段
① Class MyObjectClass=MyObject.class;
② Class c=Integer.TYPE;
2.类,通过反射可以从中获取 类名、类修饰符、包信息、父类、实现的接口、构造函数、方法、字段、注解
(1)类名
①可以使用getName()或getCanonicalName()获取包含包名的类名
Class stuClass=MyObject.class;
//String stuName=stuClass.getName();
String stuName=stuClass.getCanonical();
②可以使用getSimpleName()获取不包含包名的类名
Class stuClass=MyObject.class;
String simpleClassName=stuClass.getSimpleName();
(2)修饰符 可以使用getModifiers()来获取一个类的修饰符
Class modiClass=MyObject.class;
Int modifiers=modiClass.getModifiers();
//检验修饰符
Modifier.isAbstract/isFinal(int modifiers);
Modifier.isInterface/isProtected/isPublic(int modifiers);
Modifier.isStatic/isSynchronized(int modifiers);
(3)包信息 使用Class对象获取包信息
Class pClass=MyObject.clss;
Package package=pClass.getPack();
String packageName=package.getName();
(4)父类 通过Class对象可以获取类的父类
Class objClass=MyObject.class;
Class superclass=objClass.getSuperclass();
(5) 实现接口
Class interClass=MyObject.class;
Class[] interfaces=interClass.getInterfaces();//一个类可以实现多个接口
(6) 构造函数
Class consClass=MyObject.class;
Constructor[] constructors=consClass.getConstructors();
(7) 方法
Class aClass=MyObject.class;
Method[] method=aClass.getMethods();
(8)字段可以通过Class对象获取类的字段(成员变量)
Class aClass=MyObject.class;
Field[] fields=aClass.getFields();
(9) 注解
Class aClass=MyObject.class;
Annotation[] annotations=aClass.getAnnotations();
3.构造函数 通过java反射可以在运行时检查类的构造函数并实例化对象
(1)获取Constructor对象 通过从Class对象获取的
Class aClass=MyObject.class;
Constructor[] constructors=aClass.getConstructors();
(2) 构造函数参数
Class aClass=MyObject.class;//MyObject有一个参数为字符串的公共构造函数
Constructor constructor=aClass.getConstructor(new Class[]{String.class});
Class[] parameterTypes=constructor.getParameterType();
(3)使用Constructor对象实例化对象
//获取使用字符串作为参数的constructor
Constructor constructor=MyObject.class.getConstructor(String.class);
MyObject myObject=(MyObject)constructor.newInstance(“constr”);
4.字段 通过java反射可以在运行时检查类的字段并提供get/set,通过java.lang.reflect.Field来完成
(1)可以获取Field对象
Class aClass=MyObject.class;
Field[] methods=aClass.getFields();
(2)字段名称 通过Field.getName()方法来获取字段名称
Field field=new Field();//获取field对象
String fieldName=field.getName();
(3) 字段类型
Field field=aClass.getField(“someField”);
Object fieldType=field.getType();
(4) 获取和设置字段值
Class aClass=MyObject.class;
Field field=aClass.getField(“someField”);
MyObject objectInstance=new MyObject();
Object value=field.get(objectInstance);
Field.set(objectInstance,value);
5.方法 使用java反射在运行时检查类的方法并调用他们
(1)获取Method对象
Class class1=MyObject.class;
Method methods=class1.getMethods();
(2) 方法的参数和返回值类型
Method method=class1.getMethods();
Class returnType=method.getReturnType();
(3)使用Method对象调用方法
Method method=MyObject.class.getMethod(“doSomething”,String.class);
Object returnValue=method.invoke(null,”parameterValue”);
6. Get和set方法
7. 私有字段和方法
(1)访问私有字段通过class.getDeclaredField(Stringname)或class.getDeclaredFields()
(2)访问私有方法 通过class.getDeclaredMethod(String name,Class[] parameterTypes)或class.getDeclaredMethod()
8. Array
(1) Java.lang.reflect.Array 通过java反射使用数组完成
(2) 创建数组
Int[] array=(int[])Array.newInstance(int.class,3);
(3)访问数组 通过Array.get()和Array.set()
Int[] array=(int[])Array.newInstance(int.class,3);
Array.set(array,0,123);
Array.set(array,1,456);
System.out.println(“array[0]=”+Array.get(array,0));
System.out.println(“array[1]=”+Array.get(array,1));
(4)获取数组的class对象
(5)获取数组的组件类型 通过class.getComponentType()来获取其它组件类型
String[] stings=new String[3];
Class stringArrayClass=strings.getClass();
Class stringArrayComponentType=stringArrayClass.getComponentType();
System.out.println(stringArrayComponentType);
9.注解 使用java反射机制可以在运行时访问java类中的注解
(1) 类注解
Class aClass=TheClass.class;
Annotation[] annotations=aClass.getAnnotations();
For(Annotation annotation:annotations){
If(annotation instanceof MyAnnotation){
MyAnnotation myAnnotation=(MyAnnotation) annotation;
System.out.println(“name:”+myAnnotation.name());
System.out.println(“value:”+myAnnotation.value());
}
}
(2) 方法注解
Public class TheClass{
@MyAnnotation(name=”someName”,value=”HelloWorld”)
Public void doSomething(){}
}
(3) 参数注解
Public class TheClass{
Public static void doSomethingElse(
@MyAnnotation(name=“aName”,value=”aValue”) String parameter
){}
}
(4) 字段注解
Public class TheClass{
@MyAnnotation(name=”someName”,value=”Hello World”)
Public String myField=null;
}
10. 泛型
(1) 泛型方法的返回值类型
Protected List stringList=new ArrayList();
Public List getStringList(){
Return this.stringList;
}
(2) 泛型方法的参数类型
Protected List stringList=new ArrayList();
Public void setStringList(List list){
This.stringList=list;
}
(3) 泛型字段类型
Public class MyClass{
Public List stringList=new ArrayList();
}
Field field=MyClass.class.getField(“stringList”);
Type genericFieldType=field.getGenericType();
If(genericFieldType instanceof ParameterizedType){
ParameterizedType aType=(ParameterizedType) genericFieldType;
Type[] fieldArgTypes=aType.getActualTypeArguments();
For(Type fieldArgType: fieldArgTypes){
Class fieldArgClass=(Class)fieldArgType;
System.out.println(“fieldArgClass=”+fieldArgClass);
}
}
网友评论