import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class ReflectDemo {
public static void main(String[] args) {
Object obj = create("com.tarena.day19.Foo");
// reflect(obj);
getFieldValue(obj, "a");
Object val = call(obj,"add",new Class[]{int.class,Double.class},new Object[]{3,3D});
System.out.println("val= "+val);
}
/**
* 任务:访问某对象的方法
*
* @param obj
* @param method
* @param paramTypes
* @param params
* @return
*/
public static Object call(Object obj, String method, Class[] paramTypes,
Object[] params) {
try {
// 发现类型
Class cls = obj.getClass();
Method m = cls.getDeclaredMethod(method, paramTypes);
Object val = m.invoke(obj, params);
return val;
} catch (Exception e) {
// e.printStackTrace();
RuntimeException re = new RuntimeException("出错了!", e);
throw re;//这里抛出RuntimeException
}
}
/**
* 任务:访问某对象的某属性
* @param target
* @param fieldname
* @return
*/
public static Object getFieldValue(Object target, String fieldname) {
try {
Class clazz = target.getClass();
Field field = clazz.getDeclaredField(fieldname);
Object val = field.get(target);
return val;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("出错了。", e);
}
}
public static Object create(String classname){
try{
Class clazz = Class.forName(classname);
Object obj = clazz.newInstance();//调用无参构造方法,因此类型当中必须得声明无参构造方法
return obj;
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException("创建对象出错了。", e);
}
}
/**
* 反射方法:用于发现obj的类型是什么
* obj中有哪些属性
* obj中有哪些方法
* obj中有哪些构造方法
*
* @param obj 被"反射"的对象,被用于“发现”的对象
*/
public static void reflect(Object obj){
// getClass()来自obj类,返回对象的类型
Class clazz = obj.getClass();
System.out.println("类: "+clazz.getName());
Field[] fields = clazz.getDeclaredFields();
System.out.println("属性: ");
for(Field field : fields){
System.out.println(field.getType() + "-" + field.getName());//属性类型 跟 属性名称
}
System.out.println("方法: ");
Method[] methods = clazz.getDeclaredMethods();
for(Method method : methods){
StringBuilder sb = new StringBuilder();
sb.append(Modifier.toString(method.getModifiers())).append(" ");
sb.append(method.getReturnType()).append(" ");
sb.append(method.getName()).append("(");
for(Class cls : method.getParameterTypes()){
sb.append(cls.getName()).append(",");
}
if(method.getParameterTypes().length>0){
sb.deleteCharAt(sb.length()-1);
}
sb.append(")");
System.out.println(sb.toString());
}
System.out.println("构造器: ");
Constructor[] constructors = clazz.getConstructors();
System.out.println("构造器数量: "+constructors.length);
for(Constructor c : constructors){
StringBuilder sb = new StringBuilder();
sb.append(c.getName()).append("(");
for(Class cls : c.getParameterTypes()){
sb.append(cls.getName()).append(",");
}
if(c.getParameterTypes().length>0){
sb.deleteCharAt(sb.length()-1);
}
sb.append(")");
System.out.println(sb.toString());
}
}
}
class Foo {
int a = 3;
public Foo(){
}
public Foo(int a){
this.a = a;
}
public double add(int b, Double d) {
return a + b + d;// 自动拆箱
}
}