您的位置:首页 > 编程语言 > Java开发

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)方法返回值类型的泛型

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 类的动态加载和重新加载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: