7 java反射总结

来源:互联网 发布:mysql unix timestamp 编辑:程序博客网 时间:2024/06/06 01:25

Java的反射机制使得它可以在运行时检查类、接口、字段、方法,而在编译时并不知道他们的名称。
1 class对象
1) 获得Class对象的三种方法:
*通过调用类实例的getClass()方法
Class c = 对象名.getClass();
*通过类的名字
Class c = java.awt.Button.class;
*如果类名在编译期不知道,但是在运行期可以获得
Class c = Class.forName(str);//str是类的全路径
2)获得类名
String className = aClass.getName();
String simpleClassName = aClass.getSimpleName();
3) 获得修饰符
int modifiers = aClass.getModifiers();
4)获得包信息
Package package = aClass.getPackage();
5)获得父类
Class superclass = aClass.getSuperclass();
6)获得接口
Class[] interfaces = aClass.getInterfaces();

2 构造函数
1)获取构造函数对象
Constructor[] constructors = aClass.getConstructors();
Constructor constructor = aClass.getConstructor(new Class[]{String.class});
2)构造函数的参数
Class[] parameterTypes = constructor.getParameterTypes();
3)通过构造函数对象实例化对象
MyObject myObject = (MyObject) constructor.newInstance(“constructor-arg1”);

3 字段
1)获取Field对象
Field[] methods = aClass.getFields();
Field field = aClass.getField(“someField”);
2)字段名
String fieldName = field.getName();
3)字段类型
Object fieldType = field.getType();
4)get/set字段的值
Object value = field.get(objectInstance);
field.set(objectInstance,value);
如果字段是静态字段,则传null作为get和set方法的参数。

4 方法
1)获取Method对象
Method[] methods = aClass.getMethods();
Method method = aClass.getMethod(“doSomething”,new Class[]{String.class});
Method method = aClass.getMethod(“doSomething”,null);
2)Method的参数和返回值类型
Class[] parameterTypes = method.getParameterTypes();
Class returnType = method.getReturnType();
3)使用Method对象的invoke方法
Method method = MyObject.class.getMethod(“doSomething”,String.class);
Object returnValue = method.invoke(null,”parameter-value1”);
如果是静态方法传null,如果不是静态方法传对象实例。

5 Getter和Setter

6 私有字段和私有方法
1)访问私有字段
aClass.getDeclaredField(String name)
aClass.getDeclaredFields()
file.setAccessible(true)方法,关闭了对特定的Field实例的访问检查。
2)访问私有方法
aClass.getDeclaredMethod(String name,Class[] parameterTypes)
aClass.getDeclaredMethods()
method.setAccessible(true)方法,关闭了对特定的Method实例的访问检查。

7 注解

8 泛型
在运行时,你不会知道参数化类型它自己的类型,但是你能知道用了参数化类型的字段和方法的类型。
1)方法返回值类型的泛型

Method method = MyClass.class.getMethod("getStringList", null);Type returnType = method.getGenericReturnType();if(returnType instanceof ParameterizedType){    ParameterizedType type = (ParameterizedType) returnType;    Type[] typeArguments = type.getActualTypeArguments();    for(Type typeArgument : typeArguments){        Class typeArgClass = (Class) typeArgument;        System.out.println("typeArgClass = " + typeArgClass);    }}

这段代码将会打印出“typeArgClass = java.lang.String”.Type[ ]类型的数组typeArguements中包含一个项——一个代表实现了Type接口的java.lang.String.Class的Class实例。
2)方法参数类型的泛型
3)字段类型的泛型
9 数组
1 java.lang.reflect.Array类
通过Java反射来处理数组需要用到java.lang.reflect.Array类。
2 创建数组
int[] intArray = (int[]) Array.newInstance(int.class,3);
3 访问数组元素
通过Array.get(…)和Array.set(…)

int[] intArray = (int[]) Array.newInstance(int.class, 3);Array.set(intArray, 0, 123);Array.set(intArray, 1, 456);Array.set(intArray, 2, 789);System.out.println("intArray[0] = " + Array.get(intArray, 0));System.out.println("intArray[1] = " + Array.get(intArray, 1));System.out.println("intArray[2] = " + Array.get(intArray, 2));

4 获得数组的Class对象
*不同反射可以这样做:
Class stringArrayClass = String[].class;
*访问基本数据类型数组的Class对象
Class intArray = Class.forName(“[I”);
*对象类型数组
Class stringArrayClass = Class.forName(“[Ljava.lang.String;”);
5 获得数组的元素类型
通过aclass.getComponentType()方法访问它的元素类型。

10 动态代理

11 类的动态加载和重新加载

0 0