Java程序语言的后门(5)

——————— 获取所有公有的属性 —————————
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)
  所以我们使用另外一个方法解决这个问题:

// 实例化对象 // 获取构造器 Constructor con = clazz.getDeclaredConstructor(); // 强制设置为可以访问 con.setAccessible(true); HaShiQi haShiQi = (HaShiQi)con.newInstance(); System.out.println("没有做任何修改前:"+haShiQi.toString());

  打印结果:  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/d6c6a85d67794374490ef85f86c9a69d.html