例子:访问被private 修饰的方法和属性
采用反射机制,访问下边的类:
Java代码 收藏代码
public class Private
{
private String name = "张三";
private String getName()
{
return name;
}
}
把该类中private修饰的 name 值改成“李四”,并且用反射机制调用 getName 方法,返回修改后的值。
Java代码 收藏代码
package com.wangzhuo.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class PrivateTest
{
public static void main(String[] args)throws Exception
{
//获取Private类的Class对象
Class> classType = Class.forName("com.wangzhuo.reflect.Private");
//获取其构造方法对应的Constructor对象
Constructor con = classType.getDeclaredConstructor(new Class[]{});
//创建Private的对象
Object object =con.newInstance(new Object[]{});
//获取Private类中name属性对应的Field对象
Field field = classType.getDeclaredField("name");
//设置避开java访问控制检测
field.setAccessible(true);
//获取修改前的值
Object str = field.get(object);
System.out.println("修改之前name的值:"+(String)str);
//给name属性赋值
field.set(object, "李四");
//获取getName方法对应的Method对象
Method getNameMethod = classType.getDeclaredMethod("getName", new Class[]{});
//设置避开java访问控制检测
getNameMethod.setAccessible(true);
//调用方法,返回值
Object o = getNameMethod.invoke(object, new Object[]{});
System.out.println("修改之后name的值:"+(String)o);
}
}
以上,为java反射机制的使用例子。
public class Demo {
public void demo(){
System.out.println("Demo is working");
}
public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
Demo demo = (Demo) Class.forName("Demo").newInstance();
demo.demo();
}
}
JDK 1.5下面一点问题都没有,检查你实际生成的.class文件是不是在你执行的路径里面?你的八成是class path问题
Class clazz = Class.forName("java.lang.String");
String str = (String)clazz.newInstance();