java反射Constructor,Method,Field,Array 类

/** 
* 反射就是将java类中的各个成分映射成java类,方法有Method类,包有Package类,构造方法有Constructor类 
* 反射主要用处 Spring等框架 在配置文件中配置某个累 就可以修改成员变量的值,方法 等等 
*/ 
package weiguoyuan.chainunicom.cn; 

import java.lang.reflect.Array; 
import java.lang.reflect.Constructor; 
import java.lang.reflect.Field; 
import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 
import java.util.Arrays; 

public class TestReflect { 
public static void main(String[] args) { 

/* 
* TestConstructor 测试构造方法类 
*/ 
try { 
Constructor [] constrs = Class.forName("java.lang.String").getConstructors();//得到String的所有构造方法 
Constructor constr = Class.forName("java.lang.String").getConstructor(StringBuffer.class);//getConstructor(StringBuffer.class)的参数是可变参数Class<?>... 
//new String(new StringBuffer("abc")) 
try { 
constr.newInstance(new StringBuffer("abc")); 
} catch (InstantiationException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} catch (IllegalAccessException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} catch (IllegalArgumentException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} catch (InvocationTargetException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 
} catch (SecurityException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} catch (ClassNotFoundException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 
catch (NoSuchMethodException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 

/* 
* TestField 测试成员变量的反射 
*/ 
Point p1 = new Point(3,5); 
try { 
Field fieldY = p1.getClass().getField("y"); 
//Field fieldX = p1.getClass().getField("x");// error x is private 看不到有没有该成员 看不到有钱 
Field fieldX1 = p1.getClass().getDeclaredField("x");//得到所有的成员变量,能看到成员变量了 能看到钱了 取不到 
fieldX1.setAccessible(true);//设置暴力反射 上去抢 
System.out.println(fieldY);//the output is "public int weiguoyuan.chainunicom.cn.Point.y" 
try { 
System.out.println(fieldY.get(p1));// the output is 5 
System.out.println(fieldX1.get(p1)); 

} catch (IllegalArgumentException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} catch (IllegalAccessException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 
} catch (NoSuchFieldException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} catch (SecurityException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 
/* 
* 修改成员变量的值的应用 
*/ 
try { 
changeStringValue(p1); 
System.out.println(p1); 
} catch (Exception e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 
/* 
* TestMethod 测试成员方法的反射 
*/ 
try{ 
Method methodCharAt = String.class.getMethod("charAt", int.class);//第一个函数名 第二个传人的参数类型 
System.out.println(methodCharAt.invoke(p1.str, 2));//invoke 调用,当调用的函数是静态的可以用invoke(null, 2) 
}catch(Exception e){ 
e.printStackTrace(); 
} 
/* 
* TestArray 测试数组和Object的关系及其反射类型 
*/ 
int [] arr1 = new int [3]; 
int [] arr2 = new int []{1,2}; 
int [] [] arr3 = new int [3][3]; 
String [] arr4 = new String[]{"a","b","c"}; 
System.out.println(arr1.getClass() == arr2.getClass());//结果是 ture arr1和arr2的数组类型相同并且纬度相同 
//System.out.println(arr1.getClass() == arr3.getClass()); 
//System.out.println(arr1.getClass() == arr4.getClass()); 
System.out.println(arr1.getClass().getSuperclass().getName());//结果父类是Object类 
Object obj1 = arr2; 
System.out.println(Arrays.asList(arr2));//int[]数组只是被看待成一个Object对象 输出值是[[I@50ba0dfc] 
System.out.println(Arrays.asList(arr4));//String 数组是Object[]的 三个值 输出值是[a, b, c] 

/* 
* 数组反射测试 TestArray 
*/ 
Object obj = null; 
printObject(obj); 
printObject(arr2); 

} 

public static void printObject(Object obj){ 
if(obj.getClass().isArray()){ 
for(int i = 0;i < Array.getLength(obj);i++){ //Array 是数组的反射类 
System.out.println(Array.getInt(obj, i)); 
} 
}else{ 
System.out.println(obj); 
} 
} 

public static void changeStringValue(Object obj) throws Exception{ 
Field[] fields = obj.getClass().getFields(); 
for(Field field : fields){ 
if(field.getType() == String.class){ 
String oldValue = (String)field.get(obj); 
String newValue = oldValue.replace('b', 'a'); 
field.set(obj,newValue); 
} 
} 
} 
} 

class Point { 
private int x; 
public int y; 
public String str = "bbbbcca"; 
public Point(int x, int y) { 
super(); 
this.x = x; 
this.y = y; 
} 
@Override 
public int hashCode() { 
final int prime = 31; 
int result = 1; 
result = prime * result + x; 
result = prime * result + y; 
return result; 
} 
@Override 
public boolean equals(Object obj) { 
if (this == obj) 
return true; 
if (obj == null) 
return false; 
if (getClass() != obj.getClass()) 
return false; 
Point other = (Point) obj; 
if (x != other.x) 
return false; 
if (y != other.y) 
return false; 
return true; 
} 
public int getX() { 
return x; 
} 
public void setX(int x) { 
this.x = x; 
} 
public int getY() { 
return y; 
} 
public void setY(int y) { 
this.y = y; 
} 
public String toString(){ 
return str + "x=" + this.x + "y=" + this.y; 
} 
} 

 

posted on 2014-08-21 16:58  weiguoyuan  阅读(216)  评论(0)    收藏  举报

导航