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"); }}