Student 实体类:
package com.vision.reflect;
public class Student {
private String name;
private int age ;
public Student(){}
public Student(String name, int age) {
this.name =name;
this.age=age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String study(){
System.out.println("heqiang is studying");
return "good";
}
public String study(String name , int age){
System.out.println(name +" had been studied "+age+" years" );
if(age>=10){
return "very good";
}else{
return "normal";
}
}
}
基础反射类API测试package com.vision.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class testReflectAPI {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Class c = Class.forName("com.vision.reflect.Student");
System.out.println("Class "+c.getSimpleName());
Field [] fs=c.getDeclaredFields();//获得包括私有属性在内的所有属性
for(Field f:fs){
System.out.println("\t"+f.getType().getSimpleName()+" "+f.getName());
}
Method [] ms =c.getDeclaredMethods();
for(Method m:ms){
System.out.print("\t"+m.getReturnType().getSimpleName()+" ");
System.out.print(m.getName()+"(");
Class [] ps=m.getParameterTypes();
for(Class p: ps){
System.out.print(p.getSimpleName()+"");//打印参数类型
}
System.out.println("}{}");
}
} catch (ClassNotFoundException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
反射的动态调用:
package com.vision.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class testReflect {
/**
* student类的属性name和age都是私有的,而且都没有get访问器,但通过反射依然能获取到其属性的值,所以说其破坏了对象的封装特性。
* @param args
* @throws IllegalAccessException
* @throws IllegalArgumentException
* @throws NoSuchMethodException
* @throws SecurityException
* @throws InvocationTargetException
*/
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, SecurityException, NoSuchMethodException, InvocationTargetException {
Object s =new Student("heqiang",20);
Class c = s.getClass(); //获取类对象。
Field [] fs= c.getDeclaredFields(); //获取对象s的属性
for(Field f:fs){ //遍历
f.setAccessible(true); //设置属性的可访问性为TRUE,其实破坏了对象的封装性
System.out.println(f.getName()+"="+f.get(s));//f.get(s)获取属性的值,参数表示s对象的属性值。
// f.set(s, "xiaofei"); //设置属性的值
// System.out.println(f.getName()+"="+f.get(s));
}
//***********************反射对方法的调用
Class []ps ={String.class,int.class}; //类对象的数组
Class [] ps1 = {};
Method m =c.getDeclaredMethod("study", ps);//获取Student类的study方法调用getDeclaredMethod方法的参数意思是1.方法名,2.方法的参数列表,因为有时候有方法重载的情况,方法的参数列表用类对象的参数列表表示,如ps.
Method m1=c.getDeclaredMethod("study", ps1);
Object [] os={"Alex",new Integer(19)};
Object [] os1 ={};
Object result = m.invoke(s, os); //invoke方法本身有返回值是Object类型的
System.out.println(result);
m1.invoke(s, os1);//针对对象s来调用方法study,还要给出方法的实参。如果实参是简单类型,要把简单类型转换成包装类对象
}
}