一:定義
能夠分析類能力的程序稱爲反射。
二:分析:
三:反射機制的功能:
1.在運行中分析類的能力;
2.在運行中查看對象;
3.實現通用的數組操作代碼;
4.利用Method對象,這個對象很像C++中的函數指針。----From CoreJava
或者:
四:Class類
在JDK中,主要由以下類來實現Java反射機制,這些類都位於java.lang.reflect包中:
五:實例
public class RefConstructor {
public static void main(String args[]) throws Exception {
RefConstructor ref = new RefConstructor();
ref.getConstructor();
}
public void getConstructor() throws Exception {
Class c = null;
c = Class.forName("java.lang.Long");
Class cs[] = {java.lang.String.class};
System.out.println("\n-------------------------------\n");
Constructor cst1 = c.getConstructor(cs);
System.out.println("1、通過參數獲取指定Class對象的構造方法:");
System.out.println(cst1.toString());
Constructor cst2 = c.getDeclaredConstructor(cs);
System.out.println("2、通過參數獲取指定Class對象所表示的類或接口的構造方法:");
System.out.println(cst2.toString());
Constructor cst3 = c.getEnclosingConstructor();
System.out.println("3、獲取本地或匿名類Constructor 對象,它表示基礎類的立即封閉構造方法。");
if (cst3 != null) System.out.println(cst3.toString());
else System.out.println("-- 沒有獲取到任何構造方法!");
Constructor[] csts = c.getConstructors();
System.out.println("4、獲取指定Class對象的所有構造方法:");
for (int i = 0; i < csts.length; i++) {
System.out.println(csts[i].toString());
}
System.out.println("\n-------------------------------\n");
Type[] types1 = c.getGenericInterfaces();
System.out.println("1、返回直接實現的接口:");
for (int i = 0; i < types1.length; i++) {
System.out.println(types1[i].toString());
}
Type type1 = c.getGenericSuperclass();
System.out.println("2、返回直接超類:");
System.out.println(type1.toString());
Class[] cis = c.getClasses();
System.out.println("3、返回超類和所有實現的接口:");
for (int i = 0; i < cis.length; i++) {
System.out.println(cis[i].toString());
}
Class cs1[] = c.getInterfaces();
System.out.println("4、實現的接口");
for (int i = 0; i < cs1.length; i++) {
System.out.println(cs1[i].toString());
}
System.out.println("\n-------------------------------\n");
java.lang.reflect.Field[] fs1 = c.getFields();
System.out.println("1、類或接口的所有可訪問公共字段:");
for (int i = 0; i < fs1.length; i++) {
System.out.println(fs1[i].toString());
}
java.lang.reflect.Field f1 = c.getField("MIN_VALUE");
System.out.println("2、類或接口的指定已聲明指定公共成員字段:");
System.out.println(f1.toString());
java.lang.reflect.Field[] fs2 = c.getDeclaredFields();
System.out.println("3、類或接口所聲明的所有字段:");
for (int i = 0; i < fs2.length; i++) {
System.out.println(fs2[i].toString());
}
java.lang.reflect.Field f2 = c.getDeclaredField("serialVersionUID");
System.out.println("4、類或接口的指定已聲明指定字段:");
System.out.println(f2.toString());
System.out.println("\n-------------------------------\n");
Method m1[] = c.getMethods();
System.out.println("1、返回類所有的公共成員方法:");
for (int i = 0; i < m1.length; i++) {
System.out.println(m1[i].toString());
}
Method m2 = c.getMethod("longValue", new Class[]{});
System.out.println("2、返回指定公共成員方法:");
System.out.println(m2.toString());
}
}
-------------------------------
1、通過參數獲取指定Class對象的構造方法:
public java.lang.Long(java.lang.String) throws java.lang.NumberFormatException
2、通過參數獲取指定Class對象所表示的類或接口的構造方法:
public java.lang.Long(java.lang.String) throws java.lang.NumberFormatException
3、獲取本地或匿名類Constructor 對象,它表示基礎類的立即封閉構造方法。
-- 沒有獲取到任何構造方法!
4、獲取指定Class對象的所有構造方法:
public java.lang.Long(long)
public java.lang.Long(java.lang.String) throws java.lang.NumberFormatException
-------------------------------
1、返回直接實現的接口:
java.lang.Comparable<java.lang.Long>
2、返回直接超類:
class java.lang.Number
3、返回超類和所有實現的接口:
4、實現的接口
interface java.lang.Comparable
-------------------------------
1、類或接口的所有可訪問公共字段:
public static final long java.lang.Long.MIN_VALUE
public static final long java.lang.Long.MAX_VALUE
public static final java.lang.Class java.lang.Long.TYPE
public static final int java.lang.Long.SIZE
2、類或接口的指定已聲明指定公共成員字段:
public static final long java.lang.Long.MIN_VALUE
3、類或接口所聲明的所有字段:
public static final long java.lang.Long.MIN_VALUE
public static final long java.lang.Long.MAX_VALUE
public static final java.lang.Class java.lang.Long.TYPE
private final long java.lang.Long.value
public static final int java.lang.Long.SIZE
private static final long java.lang.Long.serialVersionUID
4、類或接口的指定已聲明指定字段:
private static final long java.lang.Long.serialVersionUID
-------------------------------
1、返回類所有的公共成員方法:
public static int java.lang.Long.numberOfLeadingZeros(long)
public static int java.lang.Long.numberOfTrailingZeros(long)
public static int java.lang.Long.bitCount(long)
public boolean java.lang.Long.equals(java.lang.Object)
public java.lang.String java.lang.Long.toString()
public static java.lang.String java.lang.Long.toString(long,int)
public static java.lang.String java.lang.Long.toString(long)
public int java.lang.Long.hashCode()
public static long java.lang.Long.reverseBytes(long)
public int java.lang.Long.compareTo(java.lang.Long)
public int java.lang.Long.compareTo(java.lang.Object)
public static java.lang.Long java.lang.Long.getLong(java.lang.String)
public static java.lang.Long java.lang.Long.getLong(java.lang.String,java.lang.Long)
public static java.lang.Long java.lang.Long.getLong(java.lang.String,long)
public byte java.lang.Long.byteValue()
public short java.lang.Long.shortValue()
public int java.lang.Long.intValue()
public long java.lang.Long.longValue()
public float java.lang.Long.floatValue()
public double java.lang.Long.doubleValue()
public static java.lang.Long java.lang.Long.valueOf(long)
public static java.lang.Long java.lang.Long.valueOf(java.lang.String,int) throws java.lang.NumberFormatException
public static java.lang.Long java.lang.Long.valueOf(java.lang.String) throws java.lang.NumberFormatException
public static java.lang.String java.lang.Long.toHexString(long)
public static int java.lang.Long.compare(long,long)
public static java.lang.Long java.lang.Long.decode(java.lang.String) throws java.lang.NumberFormatException
public static long java.lang.Long.reverse(long)
public static long java.lang.Long.highestOneBit(long)
public static long java.lang.Long.lowestOneBit(long)
public static long java.lang.Long.rotateLeft(long,int)
public static long java.lang.Long.rotateRight(long,int)
public static int java.lang.Long.signum(long)
public static java.lang.String java.lang.Long.toBinaryString(long)
public static java.lang.String java.lang.Long.toOctalString(long)
public static long java.lang.Long.parseLong(java.lang.String) throws java.lang.NumberFormatException
public static long java.lang.Long.parseLong(java.lang.String,int) throws java.lang.NumberFormatException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
2、返回指定公共成員方法:
public long java.lang.Long.longValue()
<span style="color:#555555;">public class ReflectTester {
public Object copy(Object object) throws Exception {
// 獲得對象的類型
Class<?> classType = object.getClass();
System.out.println("Class:" + classType.getName());
// 通過默認構造方法創建一個新的對象
</span><span style="color:#ff0000;">Object objectCopy = classType.getConstructor(new Class[]{}).newInstance(new Object[]{});</span><span style="color:#555555;">
// 獲得對象的所有屬性
Field fields[] = classType.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
String fieldName = field.getName();
String firstLetter = fieldName.substring(0, 1).toUpperCase();
// 獲得和屬性對應的getXXX()方法的名字
String getMethodName = "get" + firstLetter + fieldName.substring(1);
// 獲得和屬性對應的setXXX()方法的名字
String setMethodName = "set" + firstLetter + fieldName.substring(1);
// 獲得和屬性對應的getXXX()方法
Method getMethod = classType.getMethod(getMethodName, new Class[]{});
// 獲得和屬性對應的setXXX()方法
Method setMethod = classType.getMethod(setMethodName, new Class[]{field.getType()});
// 調用原對象的getXXX()方法
Object value = getMethod.invoke(object, new Object[]{});
System.out.println(fieldName + ":" + value);
// 調用拷貝對象的setXXX()方法
setMethod.invoke(objectCopy, new Object[]{value});
}
return objectCopy;
}
public static void main(String[] args) throws Exception {
Customer customer = new Customer("Tom", 21);
customer.setId(new Long(1));
Customer customerCopy = (Customer) new ReflectTester().copy(customer);
System.out.println("Copy information:" + customerCopy.getId() + " " + customerCopy.getName() + " "
+ customerCopy.getAge());
}
}
class Customer {
private Long id;
private String name;
private int age;
public Customer() {
}
public Customer(String name, int age) {
this.name = name;
this.age = age;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}</span>
Class:com.langsin.reflection.Customer
id:1
name:Tom
age:21
Copy information:1 Tom 21
Process finished with exit code 0
public class InvokeTester {
public int add(int param1, int param2) {
return param1 + param2;
}
public String echo(String msg) {
return "echo: " + msg;
}
public static void main(String[] args) throws Exception {
Class<?> classType = InvokeTester.class;
Object invokeTester = classType.newInstance();
// Object invokeTester = classType.getConstructor(new
// Class[]{}).newInstance(new Object[]{});
//獲取InvokeTester類的add()方法
Method addMethod = classType.getMethod("add", new Class[]{int.class, int.class});
//調用invokeTester對象上的add()方法
Object result = addMethod.invoke(invokeTester, new Object[]{new Integer(100), new Integer(200)});
System.out.println((Integer) result);
//獲取InvokeTester類的echo()方法
Method echoMethod = classType.getMethod("echo", new Class[]{String.class});
//調用invokeTester對象的echo()方法
result = echoMethod.invoke(invokeTester, new Object[]{"Hello"});
System.out.println((String) result);
}
}
public class ArrayTester1 {
public static void main(String args[]) throws Exception {
Class<?> classType = Class.forName("java.lang.String");
// 創建一個長度爲10的字符串數組
Object array = Array.newInstance(classType, 10);
// 把索引位置爲5的元素設爲"hello"
Array.set(array, 5, "hello");
// 獲得索引位置爲5的元素的值
String s = (String) Array.get(array, 5);
System.out.println(s);
}
}
public class ArrayTester2 {
public static void main(String args[]) {
int[] dims = new int[]{5, 10, 15};
//創建一個具有指定的組件類型和維度的新數組。
Object array = Array.newInstance(Integer.TYPE, dims);
Object arrayObj = Array.get(array, 3);
Class<?> cls = arrayObj.getClass().getComponentType();
System.out.println(cls);
arrayObj = Array.get(arrayObj, 5);
Array.setInt(arrayObj, 10, 37);
int arrayCast[][][] = (int[][][]) array;
System.out.println(arrayCast[3][5][10]);
}
}
public class RefFiled {
public double x;
public Double y;
public static void main(String args[]) throws NoSuchFieldException, IllegalAccessException {
Class c = RefFiled.class;
Field xf = c.getField("x");
Field yf = c.getField("y");
RefFiled obj = new RefFiled();
System.out.println("變更前x=" + xf.get(obj));
//變更成員x值
xf.set(obj, 1.1);
System.out.println("變更後x=" + xf.get(obj));
System.out.println("變更前y=" + yf.get(obj));
//變更成員y值
yf.set(obj, 2.1);
System.out.println("變更後y=" + yf.get(obj));
}
}