zoukankan      html  css  js  c++  java
  • 回忆(四):通过反射获得私有构造实例化得到对象

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


  • 相关阅读:
    BZOJ4238:电压
    BZOJ4566:[HAOI2016]找相同字符
    BZOJ4530:[BJOI2014]大融合
    BZOJ1912:[APIO2010]patrol巡逻
    BZOJ3998:[TJOI2015]弦论
    CNBlogs 样式修改
    POJ-3321 Apple Tree 【DFS序+树状数组】
    BZOJ-2152 聪聪可可 【点分治】
    POJ-1741 Tree 【点分治】
    Treap实现名次树
  • 原文地址:https://www.cnblogs.com/mzywucai/p/11053447.html
Copyright © 2011-2022 走看看