定义测试的类
package top.demo.ref;
import org.omg.PortableInterceptor.DISCARDING;
public class Test {
public int id;
private String name;
public Test(){
}
public Test(String name){
this.name=name;
}
private void disPrivate() {
System.out.println("disPrivate");
}
private void disPrivate(String var) {
System.out.println("disPrivate var:"+var);
}
public void disPublic() {
System.out.println("disPublic");
}
public void disPublic(String var) {
System.out.println("disPublic var:"+var);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
测试
package top.demo.ref;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Main {
public static void main(String argv[]) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException
{
//获得指定类的 类信息对象
Class<Test> cl=(Class<Test>) Class.forName("top.demo.ref.Test");
//----------构造函数
//通过Class对象 获得无参构造
Constructor cons=cl.getConstructor();
//分别通过 构造对象和Class对象进行 创建对象 (无参构造)
Test ob=(Test) cons.newInstance();
Test ob2=(Test) cl.newInstance();
ob.id=88;
System.out.println(ob.id);
Constructor cons2=cl.getConstructor(String.class);
Test ob3=(Test) cons2.newInstance(String.valueOf("这是带参的构成对象 创建的Test对象,注意传入参数只能是Object"));
//----------成员函数
//通过getMethod拿到带参函数 (getMethod只能拿public方法 如要拿私有用带XXXDeclaredXXXX的 否则异常)
//Method disPrivate=cl.getMethod("disPrivate", String.class);
//Exception in thread "main" java.lang.NoSuchMethodException: top.demo.ref.Test.disPrivate(java.lang.String)
Method disPrivateDecla=cl.getDeclaredMethod("disPrivate", String.class);
//disPrivateDecla.invoke(ob, "因为是私有的即使拿到也不能调用");
//Exception in thread "main" java.lang.IllegalAccessException: Class top.demo.ref.
//setAccessible本质上是访问权限检测的开关
disPrivateDecla.setAccessible(true);
disPrivateDecla.invoke(ob, "通过设置 访问检测性为true 可以调用私有方法");
Method disPublic=cl.getMethod("disPublic", String.class);
disPublic.invoke(ob2, "因为这个方法不是静态方法,所以传入ob2实例 直接调用");
//获得无参函数 并ob3调用
Method getName=cl.getMethod("getName");
System.out.println(getName.invoke(ob3,null));
//----------成员变量
//通过getField拿到成员变量 (于方法类似 只能拿public 私有请用XXXDeclaredXXXX)
Field fieldId=cl.getField("id");
fieldId.set(ob, 2);
System.out.println(ob.getId());
Field fieldName=cl.getDeclaredField("name");
//fieldName.set(ob, "因为是私有的属性 所有不能访问");
//Exception in thread "main" java.lang.IllegalAccessException: Class top.dem
fieldName.setAccessible(true);
fieldName.set(ob, "设置可访问后,能够正常访问私有的属性");
}
}