设为首页 加入收藏

TOP

Java程序语言的后门-反射机制(四)
2018-10-10 04:11:13 】 浏览:693
Tags:Java 程序 语言 后门 反射 机制
java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
——————— 获取所有类中声明的方法 —————————
public void com.zcz.reflecttest.HaShiQi.run()
public java.lang.String com.zcz.reflecttest.HaShiQi.toString()
private void com.zcz.reflecttest.HaShiQi.dance()
public void com.zcz.reflecttest.HaShiQi.eat()
——————— 获取所有公有的构造器 —————————


  因为HaShiQi类中没有公有的构造器,所以这里什么都没有打印出来。自然也有获取到私有构造器的方法:


public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
// TODO Auto-generated method stub
//获取类对象,除了这份方法外还有另外两种方法
Class clazz = HaShiQi.class;


  打印结果:


——————— 获取所有公有的属性 —————————
public java.lang.String com.zcz.reflecttest.HaShiQi.color
——————— 获取所有的属性 —————————
public java.lang.String com.zcz.reflecttest.HaShiQi.color
private java.lang.String com.zcz.reflecttest.HaShiQi.name
——————— 获取所有公有的方法 —————————
public void com.zcz.reflecttest.HaShiQi.run()
public java.lang.String com.zcz.reflecttest.HaShiQi.toString()
public void com.zcz.reflecttest.HaShiQi.eat()
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
——————— 获取所有类中声明的方法 —————————
public void com.zcz.reflecttest.HaShiQi.run()
public java.lang.String com.zcz.reflecttest.HaShiQi.toString()
private void com.zcz.reflecttest.HaShiQi.dance()
public void com.zcz.reflecttest.HaShiQi.eat()
——————— 获取所有公有的构造器 —————————
——————— 获取所有的构造器 —————————
private com.zcz.reflecttest.HaShiQi()


七,实例化对象


  HaSHiQi类中的信息,包括属性,方法,构造器,我们都已经通过反射浏览了一遍,那么接下来就要再使用反射实例化HaShiQi类的对象了,因为只有实例对象才能调用属性和方法。


  因为HaShiQi类中只显示声明了一个空参构造器,所以我们只能使用这个构造器来实例化对象。


  正常情况下获取指定参数的构造器,需要使用方法clazz.getConstructor(parameterTypes(参数类对象数组))。但是HaShiQi的构造方法是私有的,所以使用这个方法去获取构造器会报错:


Constructor cons = clazz.getConstructor();
Exception in thread "main" java.lang.NoSuchMethodException: com.zcz.reflecttest.HaShiQi.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.getConstructor(Class.java:1825)
at com.zcz.reflecttest.LookLook.main(LookLook.java:61)
  所以我们使用另外一个方法解决这个问题:


  打印结果:  


没有做任何修改前:名字:富贵;颜色:黑色
  哈哈,机智如我,怎么能被这种问题打到,从代码中可以看到我们使用了构造器的newInstance方法实例化了一个HaShiQi对象。


    代码:con.newInstance();


    是不是很熟悉?,在文章JAVA设计模式-动态代理(Proxy)源码分析中,实例化代理类对象的时候,也使用到了:


// 通过反射,将h作为参数,实例化代理类,返回代理类实例。
return cons.newInstance(new Object[]{h});
  接下来就是访问对象的属性和方法了如果我们把所有的属性和方法都访问到,不就把同事的狗狗看了一遍了吗?。


八,修改属性


  打印结果: 


没有做任何修改前:名

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇JVM自定义类加载器加载指定classP.. 下一篇Java SpringBoot集成RabbitMQ实战..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目