黑马程序员——Java反射
---------------------- android培训、java培训、期待与您交流! ----------------------
一、Java语言的反射机制
在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。
Java 反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法。
二、Class 对象的取得途径
Java允许我们从多种途径为一个class生成对应的Classobject
三、构造方法(Constructor)的反射
Class.getConstructors():获得类的public类型的构造方法。
Class.getConstructor(Class[]parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
● 实例:
Constructor<?> con = String.class.getDeclaredConstructor(byte[].class);
System.out.println(con);
String s=(String)con.newInstance("fengyan".getBytes());
System.out.println(s);
四、成员变量(Field)的反射
Field类代表类的成员变量(成员变量也称为类的属性)。
Class.getField(String name):根据指定成员名获得类的public类型的属性。
Class.getDeclaredField(String name):根据指定成员名获得类的属性(包括private属性)。
Field.setAccessible(boolean flag):用指定的标记设置属性的访问权限。
Field.get(Object obj):返回这个字段在指定对象上的值。
● 实例:
public class ReflectPoint {
private int x;
public int y;
public ReflectPoint(int x, int y) {
this.x = x;
this.y = y;
}
}
import java.lang.reflect.Field;
public class ReflectField {
public static void main(String[] args) throws Exception {
ReflectPoint pt = new ReflectPoint(3, 5);
Field fieldX = pt.getClass().getDeclaredField("x");
Field fieldY = pt.getClass().getField("y");
fieldX.setAccessible(true);
System.out.println("x = " + fieldX.get(pt));//访问私有成员
System.out.println("y = " + fieldY.get(pt));
}
}
五、成员方法(Method)的反射
Method类代表类的一个成员方法。
得到类的某一人方法:
MethodcharAt=String.class.getMethod(“charAt”, int.class);
调用方法:
通常方式:System.out.println(“fengyan”.charAt(1));
反射方式:System.out.println(charAt.invoke(“fengyan”,1));
如果Method为静态方法,则调用invoke(Object obj, Object… args)方法的第一个参数传null。
● 实例:通过反射调用main(String[] args)方法
package com.heima.reflect;
public class InvokeMain {
public static void main(String[] args) {
if (args != null && args.length > 0) {
for (String arg : args)
System.out.println(arg);
} else {
System.out.println("args is null");
}
}
}
import java.lang.reflect.Method;
public class ReflectInvokeMain {
public static void main(String[] args) throws Exception {
String className = "com.heima.reflect.InvokeMain";
Class<?> clazz = Class.forName(className);
Method main = clazz.getMethod("main", String[].class);
main.invoke(null, new Object[] { new String[] { "111", "222", "333" } });
}
}
---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima