package reflex;
import java.lang.reflect.Constructor;
/*
* 需求:通过反射获取私有构造方法并使用
* private Person(String name) {}
*/
public class ReflectDemo04_getConstructor_private_newInstance {
public static void main(String[] args) throws Exception{
// 获取字节码对象
Class c = Class.forName("reflex.Person");
// 获取私有构造方法
// NoSuchMethodException 没有这个方法异常
// 此方法无法找到其中的私有和默认修饰符修饰的构造方法
// Constructor con = c.getConstructor(String.class);
// java.lang.IllegalAccessException 非法的访问异常
// 暴力访问
Constructor con = c.getDeclaredConstructor(String.class);
// 反射很强大
// public void setAccessible(boolean flag)
// throws SecurityException将此对象的
// accessible 标志设置为指示的布尔值。
// 值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。
// 值为 false 则指示反射的对象应该实施 Java 语言访问检查。
con.setAccessible(true); // 设置可访问为:true
// 用该私有构造方法创建对象
Object obj = con.newInstance("mzy");
// 一般的java反编译工具就是使用了反射的机制
System.out.println(obj);
// 然而java是号称安全的语言,
// 所以我们在写java文件的时候,可以加两行加密的语句
// 按照某种特殊的运算方法,对数据进行异或操作
// 也能进行加密
}
}
其中的person:
package reflex;
public class Person {
// 成员变量
private String name;
int age;
public String address;
// 构造方法
public Person() {
}
Person(String name, int age) {
this.name = name;
this.age = age;
}
private Person(String name) {
this.name = name;
}
public Person(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
// 成员方法
public void show() {
System.out.println("show");
}
public void method(String s) {
System.out.println("method" + s);
}
public String getString(String s, int i) {
return s + "---" + i;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
}
private void function() {
System.out.println("function");
}
}