回忆(四):通过反射获得私有构造实例化得到对象

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

}


原文地址:https://www.cnblogs.com/mzywucai/p/11053447.html