7 java反射总结
2017-01-14 16:53
357 查看
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)方法返回值类型的泛型
这段代码将会打印出“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(…)
4 获得数组的Class对象
*不同反射可以这样做:
Class stringArrayClass = String[].class;
*访问基本数据类型数组的Class对象
Class intArray = Class.forName(“[I”);
*对象类型数组
Class stringArrayClass = Class.forName(“[Ljava.lang.String;”);
5 获得数组的元素类型
通过aclass.getComponentType()方法访问它的元素类型。
10 动态代理
11 类的动态加载和重新加载
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 类的动态加载和重新加载
相关文章推荐
- java 反射 总结
- java反射总结
- Java 反射获取类详细信息的常用方法总结
- 黑马程序员_java反射总结
- 基于java中反射的总结分析
- java 反射的一些使用总结
- 黑马程序员:Java基础总结----反射
- java反射reflect学习总结
- 黑马程序员__JAVA高新技术--反射、注解总结
- Java增强_反射的总结
- java 反射 总结
- Java基础加强反射总结
- 黑马程序员___java反射的总结
- 黑马程序员 Java高新技术 反射总结
- java中的反射总结
- java 反射 总结
- java 反射知识总结
- Core Java第十六章知识点总结——反射
- Java 反射机制简单总结
- Java反射与内省机制总结