//这是测试类
package cn.hncu.reflect;
public class Person {
public String name;
public int age;
public int num;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double sum(int n,double d)throws Exception{
double sum=0;
for(int i=0;i<n;i++){
sum+=d;
}
return sum;
}
public static void show(){
System.out.println("我来看看吧");
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
private int abc(){
return 10;
}
}
//演示类
<pre class="java" name="code">package cn.hncu.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectOpera {
private static final String CLASS_NAME="cn.hncu.reflect.Person";
public static void main(String[] args) {
try {
//operaConstructor();
//callMethod();
//callMethod2();
//callMethod3();
//changeFieldValue();
brokeAccess();
} catch (Exception e) {
e.printStackTrace();
}
}
//六,暴力访问--可以访问私有的,也可以把public的东西权限关掉。
private static void brokeAccess() throws Exception {
Class cls=Class.forName(CLASS_NAME);
Object obj=cls.newInstance();
Method method=cls.getDeclaredMethod("abc", null);
method.setAccessible(true);//暴力访问--在调用前打开访问权限开关。
Object resObj=method.invoke(obj, null);
System.out.println(resObj);
}
//五,改变变量的值
private static void changeFieldValue() throws Exception {
Class cls=Class.forName(CLASS_NAME);
Object obj=cls.newInstance();
Field field=cls.getField("num");//所有变量的num,至于那个对象要给定
field.set(obj, 23);
Person p=new Person();
p.num=999;
//读取属性值
System.out.println(field.get(obj));//返回Object,通用
System.out.println(field.getInt(p));//获取某个对象的值。返回Int
}
//四,调用静态函数,不需要对象
private static void callMethod3() throws Exception {
Class cls=Class.forName(CLASS_NAME);
Method m=cls.getMethod("show", null);
m.invoke(null, null);
}
//三调用有参函数
private static void callMethod2() throws Exception {
Class cls=Class.forName(CLASS_NAME);
Object obj=cls.newInstance();
Class params[]=new Class[2];
params[0]=int.class;//Integer.TYPE也是可以的
params[1]=double.class;//这里没有装箱拆箱,必须是double.class.Double.class会挂掉
Method method=cls.getMethod("sum", params);
Object objs[]=new Object[2];
objs[0]=10;
objs[1]=2.34;
Object returnValue= method.invoke(obj, objs);
System.out.println(returnValue);
// double dd=(Double)returnValue;
// dd=dd+10;
// System.out.println(dd);
}
//二,调用无参的普通方法
private static void callMethod() throws Exception {
Class cls=Class.forName(CLASS_NAME);
//1,调用空参方法
//1.1必须要有一个类对象
Object obj=cls.newInstance();
//1.2用对象来调方法
//Class params[]=new Class[];
Method method=cls.getMethod("getName", null);
Object returnValue= method.invoke(obj, null);
System.out.println(returnValue);
}
//一,调用有参和无参的构造方法
private static void operaConstructor() throws Exception {
Class cls=Class.forName(CLASS_NAME);
//1无参构造方法的使用
//Object obj=cls.newInstance();
//2有参构造方法的使用
//@1获取有参数的构造方法
Class parameterTypes[]=new Class[2];
parameterTypes[0]=String.class;
parameterTypes[1]=int.class;
Constructor con=cls.getDeclaredConstructor(parameterTypes);
//@2实参
Object params[]=new Object[2];
params[0]=new String("jack");
params[1]=new Integer(20);
Object resObj=con.newInstance(params);
System.out.println(resObj);//输出结果为--Person [name=jack, age=20]
}
}