java(19) - 反射机制(二)

2014-11-24 07:32:09 · 作者: · 浏览: 1
bject[]{}); Field[] field = cs.getDeclaredFields(); for(Field f:field){ String name = f.getName(); String firstLetter = name.substring(0,1).toUpperCase(); //获得对应属性的set和get方法的字符串。 String getMethodName = "get"+firstLetter+name.substring(1); String setMethodName = "set"+firstLetter+name.substring(1); //获得对应属性的set和get方法。 Method getMethod = cs.getMethod(getMethodName,new Class[]{}); Method setMethod = cs.getMethod(setMethodName,new Class[]{f.getType()}); //获得属性的返回值。 Object value = getMethod.invoke(o,new Object[]{}); //添加到要返回的对象中去。 setMethod.invoke(obj,new Object[]{value}); } return obj; } public static void main(String[] args) throws Exception{ Student t = new Student("zhangsan",1,2); ReflectionTest r = new ReflectionTest(); Student s = (Student)r.copy(t); System.out.println(s.getAge()+" "+s.getName()+" "+s.getNumber()); } } class Student { public String name; private int number; public int age; public Student(){} public Student(String name,int age,int number){ this.age = age; this.name = name; this.number = number; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }


反射应用于数组:

例子:

public class Test {
      public static void main(String[] args) throws Exception {
    	  
		Class
    classType  = Class.forName("java.lang.String");
		//第一个参数设置数组的类型,第二个设置数组的大小。
		Object  array = Array.newInstance(classType,10);
		//第一个参数目标数组,第二个参数指定存放位置,第三个参数要存入的元素。
	    Array.set(array,5,"java");
     	//打印
	    System.out.println((String)Array.get(array,5));
	}
}
打印: java

对于多维数组的创建:

例子:

public class Test {
      public static void main(String[] args) throws Exception {
    	 //Integer.TYPE返回原生数据类型,Integer.class返回类的类型,第一个参数设置数组的类型,第二个设置数组的大小。
		Object array = Array.newInstance(Integer.TYPE,3,3,3);
		
		Object array2 = Array.get(array,2);
		
 		array2 = Array.get(array2,2);
		
 		Array.setInt(array2,2,10);
		
	    int[][][]  a  =  (int[][][])array;
     	//打印
	    System.out.println(a[2][2][2]);
	}
} 
打印: 10



使用反射调用类中的私有方法:

例子:

public class PrivateTest {
       public static void main(String[] args) throws Exception{
		
    	   A a  = new A();
    	   
    	   Class
    classType = a.getClass();
    	   
    	   Method method = classType.getDeclaredMethod("getHello",String.class);
    	   
    	   method.setAccessible(true);//压制Java的访问权限
    	   
    	   String str  = (String)method.invoke(a,"java");
    	   
    	   System.out.println(str);
	  }
}
class A{
	private String getHello(String str){
		return "你好!"+str;
	}
}
打印:你好!java



如何访问私有属性:

public class Reflection2 {
	public static void main(String[] args) throws Exception{
		Private2 p = new Private2();
		Class
   cs = p.getClass();
	    Field f = cs.getDeclaredField("name");
		f.setAccessible(true);//压制Java对方问修饰符的检查
		f.set(p,"lisi");
		System.out.println(p.getName());
	}
}
class Private2 {
	private String name ;
	public String getName(){
		return name;
	}
}

打印:lisi


通过子类获得父类的Class对象:


public class Test {
  public static void main(String[] args) {
	   
	  Class
   classType = Child.class;
	  System.out.println(classType);
	  classType = classType.getSupe