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

java_basic_review(5)java反射荔枝

2016-06-27 21:12 369 查看
【0】README

1)本文旨在 review java反射荔枝;

【1】荔枝如下

【2】实例化Class类对象

@Test // 实例化Class类对象
public void testInitializeClassObject() {
Class c1;
Class c2;
Class c3;

try {
c1 = Demo.class; // way1.
c2 = new Demo().getClass(); // way2.
c3 = Class.forName("com.basic.reflection.Demo"); // way3.

System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
System.out.println(c3.getName());
} catch (Exception e) {
e.printStackTrace();
}
/**
* class com.basic.reflection.Demo
* class com.basic.reflection.Demo
* class com.basic.reflection.Demo
* com.basic.reflection.Demo
*/
}


【3】返回一个类实现的接口

@Test // 返回一个类实现的接口
public void testGetInstancesImplemented() {
Class c1;

try {
c1 = Triangle.class;
Class[] interfaces = c1.getInterfaces();
for (Class temp: interfaces) {
System.out.println(temp.getName());
}// com.basic.reflection.Shape
} catch (Exception e) {
e.printStackTrace();
}
}

// Class 类的 getDeclareFields、getDeclareMethods、getDeclaredConstructors
// 方法将分别返回类中声明的全部域、方法和构造器;其中包括私有方法和受保护成员,但不包括超类成员.

【4】利用反射分析类的能力

@Test // 利用反射分析类的能力
public void testAnalyzeClass() {
Class c1;

try {
c1 = Triangle.class;
Field df1 = c1.getDeclaredField("width");
df1.setAccessible(true);

System.out.println(df1.getName()); // width.
Triangle t = new Triangle(1000, "i am a triangle.");
int age = df1.getInt(t);
System.out.println(age); // 1000

Method m1 = c1.getDeclaredMethod("sayShape", new Class[]{String.class, int.class});
m1.invoke(t, new Object[]{"i am a triangle", 9999}); // 调用方法.// sayShape() -> i am a triangle 9999

} catch (Exception e) {
e.printStackTrace();
}
}


【5】实例化对象

@Test // 实例化对象
public void testInstanceObject() {
Class c1;
try {
c1 = Class.forName("com.basic.reflection.Demo");
Demo d1 = (Demo)c1.newInstance(); // 调用默认构造器
System.out.println(d1.getIntField()); // 1

// 利用构造器创建对象实例(推荐).
Constructor con = c1.getDeclaredConstructor(new Class[]{int.class, String.class});
Demo d2 = (Demo) con.newInstance(new Object[]{110, "110"});
System.out.println(d2.getIntField() + d2.getStrField()); // 110110
} catch (Exception e) {
e.printStackTrace();
}
}
【6】通过反射取得并修改数组的信息
@Test // 通过反射取得并修改数组的信息
public void testOperateArray() {
int[] array = {1, 1, 0};
Class<?> demo = array.getClass().getComponentType(); // 数组类型的Class对象.

out.println("array type = " + demo.getName()); // 数组类型为int.
out.println("array length = " + Array.getLength(array));
out.println("1st element in array = " + Array.get(array, 0)); // 通过下标取得数组元素
Array.set(array, 0, 100); //修改数组的第一个元素为100(下标为0)
out.println("after modification, 1st element in array is " + Array.get(array, 0));
} /* output.
array type = int
array length = 3
1st element in array = 1
after modification, 1st element in array is 100
*/

// 通过反射修改数组大小
public static Object modifyArraySize(Object obj, int start, int newLen)	{
int oldLen = Array.getLength(obj);
Class<?> arrayType =  obj.getClass().getComponentType();
Object newArray = Array.newInstance(arrayType, newLen);

newLen = newLen > oldLen ? oldLen : newLen;
System.arraycopy(obj, start, newArray, 0, newLen);

return newArray;
}
public static void print(Object obj) {
int length = Array.getLength(obj);
Class<?> c = obj.getClass();

if(!c.isArray())
return ;
out.println("array length :" + length);
for (int i = 0; i < length; i++)
out.print(Array.get(obj, i) + " "); // Array.get(obj, i) == obj[i]
}

@Test// modify the size of array
public void testModifyArraySize() {
int[] array = {1, 7, 6, 0, 8};
int[] newArray = (int[])modifyArraySize(array, 0, 3);
System.out.println("after modifying the array size to 3.");

for(int i : newArray) {
out.print(i + " ");
}
out.println();
print(newArray);

newArray = (int[])modifyArraySize(array, 0, 8);//当新数组长度大于原始数组长度的时候
System.out.println("after modifying the array size to 8.");
print(newArray);
} // 通过反射修改数组大小 over.
/*
after modifying the array size to 3.
1 7 6
array length :3
1 7 6 after modifying the array size to 8.
array length :8
1 7 6 0 8 0 0 0
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: