反射(reflect)调用方法属性

package com.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Reflect {

/**
* 两种构造方式
* 调用方法(普通,静态,私有,有返回值,main)
* 注意:在调用私有方法时要设置权限打开
* 在调用方法时,要么直接用clazz.getethod()或者用o.getclass().getethod()
* 调用main方法时要将数组封装成一个object,否则会被拆开处理
*
* 若是一般方法
* Method m=clazz.getMethod("print");
* 相当于Person.print()方法
*
* 而static方法m=clazz.getMethod("say");
* 也相当于Person.say()方法
* 因为是静态方法,所以Person.say()可以直接执行,所以可以不传对象
* 而一般方法必须由对象调用,所以必须传一个对象
* @param tww
*/
public static void main(String[] args) {

try {
Class clazz=Class.forName("com.reflect.Person");
//两种构造对象
//1。
Object o=clazz.newInstance();

//2.构造方法
Constructor c=clazz.getConstructor();
Person p=(Person) c.newInstance();
p.print();

//调用public方法
Method m=clazz.getMethod("print");
m.invoke(o);

//调用private方法
m=clazz.getDeclaredMethod("eat");
//打开访问权限
m.setAccessible(true);
m.invoke(o);

//调用public static方法
m=clazz.getMethod("say");
m.invoke(null);

//调用有参的构造方法
m=o.getClass().getMethod("gets", String.class);
String s=(String) m.invoke(o, "gets");
System.out.println(s);

//调用main方法,注意要将数组转成一个整体
m=clazz.getMethod("main", String[].class);
m.invoke(null, (Object)new String[]{"aa","bb"});


//获取属性(private)
Person p1=new Person("mike");
Field f=clazz.getDeclaredField("name");
//权限打开
f.setAccessible(true);
//获取属性值
String name=(String) f.get(p1);
//获取属性类型
Class type=f.getType();
//可用于判断类型
System.out.println(String.class.equals(type));
System.out.println(type);
System.out.println(name);
} catch (Exception e) {
e.printStackTrace();
}
}
}

posted @ 2015-04-19 15:37  爱上咖啡的唐  阅读(342)  评论(0编辑  收藏  举报