import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 反射就是把java类中各种成分映射成相应的java类
* @author lxf
*
*/
public class ClsDemo {
public static void main(String[] args) throws Exception {
reflectField();
}
private static void clazzTest() throws Exception{
String d = "";
//获取类字节码的三种方式
Class c1 = String.class;
Class c2 = d.getClass();
Class c3 = Class.forName("java.lang.String");
System.out.println(c1 == c2); //true
System.out.println(c2 == c3); //true
System.out.println(c1); // class java.lang.String
System.out.println(c1.isPrimitive()); // false
System.out.println(int.class.isPrimitive()); // true
System.out.println(int.class == Integer.class); // false
System.out.println(int.class == Integer.TYPE); // true
System.out.println(int[].class.isPrimitive()); // false
System.out.println(int[].class.isArray()); // true
//只要是在源程序中出现的类型,不管是void,还是int[],都有各自的class的实例对象
}
/**
* 构造方法的反射
*/
private static void constructorTest() throws Exception{
//StringBuffer.class 指选择String类的那个构造函数
Constructor constr = String.class.getConstructor(StringBuffer.class);
// String str1 = (String) constr.newInstance("abc"); //error
String str2 = (String) constr.newInstance(new StringBuffer("abc"));
System.out.println(str2);
Class cls = Class.forName("java.lang.String");
String str3 = (String)cls.newInstance();//执行String类型不带参数的构造方法
System.out.println(str3);
}
/**
* 数组的反射
*/
private static void arrayTest() throws Exception{
int[] a1 = new int[]{3,4,5};
printObject(a1);
}
private static void printObject(Object o){
if(o.getClass().isArray()){
int length = Array.getLength(o);
for(int i=0;i<=length-1;i++){
System.out.println(Array.get(o, i));
}
}else{
System.out.println(o);
}
}
/**
* 成员变量的反射
* @throws Exception
*/
private static void reflectField() throws Exception{
ReflectPoint pt1 = new ReflectPoint(2, 5);
//fieldY不是对象的身上的变量,而是类上的,要用它去某个对象上去取
Field fieldY = pt1.getClass().getField("y");
System.out.println(fieldY.get(pt1));
//私有成员变量不能直接取
// Field fieldX = pt1.getClass().getField("x"); //error
Field fieldX = pt1.getClass().getDeclaredField("x");
fieldX.setAccessible(true); //不设这个取不到值
System.out.println(fieldX.get(pt1));
}
/**
* 方法的反射
* @throws Exception
*/
private static void reflectMethod() throws Exception{
ReflectMethod rm = new ReflectMethod();
Class cls = rm.getClass();
Method m1 = cls.getMethod("getNextInt", Integer.TYPE);
System.out.println(m1.invoke(rm, 12));
Method m2 = cls.getMethod("getIntArrayString", int[].class);
int[] a = new int[]{1,2,3,4};
// System.out.println(m2.invoke(rm, new int[]{1,2,3,4})); //error 为了保持jdk1.4兼容,数组会被解析成单个字符,需要外边在包一层数组
System.out.println(m2.invoke(rm, new Object[]{new int[]{1,2,3,4}}));
}
}
相关类
public class ReflectMethod {
public int getNextInt(int a){
return a;
}
public String getIntArrayString(int[] a){
String sTemp = "";
for(int x:a){
sTemp += String.valueOf(x);
}
return sTemp;
}
}
public class ReflectPoint {
private int x;
public int y;
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
}