class Person{
private String name;
private int age;
public Person(){}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
public class Fanshe{
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
Class<?> cls=Person.class;//class类对象的产生()
System.out.println(cls.newInstance());
}
}
结果:Person [name=null, age=0]
知识点:若在类中定义了构造方法,则默认的无参构造将不再生成。
Class类通过反射实例化类对象的时候,只能够调用类中的无参构造,如果现在类中没有无参构造则无法使用Class类调用,只能够通过明确的构造调用实例化。
class Person{
private String name;
private int age;
public Person(String name,int age) {
this.name=name;
this.age=age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
public class Fanshe{
public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException,
SecurityException, IllegalArgumentException, InvocationTargetException {
Class<?> cls=Person.class;//.class前面的类决定class类对象操作哪个类
Constructor<?> cons=cls.getConstructor(String.class,int.class);
System.out.println(cons.newInstance("xjy",20));
}
}
class Person{
private String name;
}
public class Fanshe{
public static void main(String[] args)throws Exception {
Class<?> cls=Class.forName("www.bit.java.testthread.Person");
Object obj=cls.newInstance();
Field nameFeild=cls.getDeclaredField("name");
nameFeild.setAccessible(true);
nameFeild.set(obj,"xjy");
System.out.println(nameFeild.get(obj));
}
}
结果:xjy
下面是AccessibleObject的解释:(引用别人的)
意思是 AccessibleObject 类是 Field Method Constructor 类的基类。它提供反射对象绕过Java语言权限控制检查的权限。
当Fields Methods Constructors被用来set get 对象域,调用方法或者产生初始化对象实例的时候会践行权限检查(public default(package) protected private)。
将反射对象中的 accessible 标志位设置为 true,就意味着允许客户端拥有超级权限,比如Java对象序列化 或者 其他持久化机制等通常禁止的机制。
所以我们在accessible 标志位设置为true 的时候需要非常谨慎,这会带来一定的安全隐患。
下面是 field.setAccessible(true); 方法的解释。
意思就是改方式是用来设置获取权限的。
如果 accessible 标志被设置为true,那么反射对象在使用的时候,不会去检查Java语言权限控制(private之类的);
如果设置为false,反射对象在使用的时候,会检查Java语言权限控制。
需要注意的是,设置为true会引起安全隐患。