以前一直说,Java的私有方法只能类的内部使用,外部无权限访问,但是,一旦使用Java的反射机制,你就可以再外部实现对其他类的私有方法的访问,下面使用一段代码来说明这个问题。
首先是被反射的类的代码
package com.bird.reflect;
import java.util.List;
/**
* @use 需要反射获取方法的类
* @author Bird
*
*/
public class Person {
public static String name = "bird";
public Person(){
System.out.println("Person");
}
public Person(String name){
System.out.println("Person name"+name);
}
public Person(String name, int password){
System.out.println("Person name password"+name+password);
}
private Person(List list){
System.out.println("Person List");
}
}
下面是反射类,也就是使用代码,其中,调用上面类的私有方法的测试方法是Test4
package com.bird.reflect;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
/**
* @解析刚才的类的函数
* @author Bird
*
*/
public class Demo1 {
@SuppressWarnings({ "unchecked", "static-access" })
@Test
public void test() throws Exception{//反射无参构造函数
Class clazz = Class.forName("com.bird.reflect.Person");//装载Person类的字节码
Constructor c = clazz.getConstructor(null);//获得构造函数
Person p = (Person) c.newInstance(null);//调用构造函数获得实例
System.out.println(p.name);//访问他的变量
}
@Test
public void test2() throws Exception{//反射有参构造函数
Class clazz = Class.forName("com.bird.reflect.Person");//装载Person类的字节码
Constructor c = clazz.getConstructor(String.class);//得到参数为String的构造函数
Person p = (Person) c.newInstance("chen");
System.out.println(p.name);
}
@Test
public void test3() throws Exception{//
Class clazz = Class.forName("com.bird.reflect.Person");//装载Person类的字节码
Constructor c = clazz.getConstructor(String.class,int.class);//两个参数
Person p = (Person) c.newInstance("dwad",123);
System.out.println(p.name);
}
@Test
public void test4() throws Exception{//反射私有构造函数,获得私有构造函数使用权限
Class clazz = Class.forName("com.bird.reflect.Person");//装载Person类的字节码
Constructor c = clazz.getDeclaredConstructor(List.class);//调用私有方法
c.setAccessible(true);//暴力反射获得私有函数访问权限
Person p = (Person) c.newInstance(new ArrayList());
System.out.println(p.name);
}
public void test5() throws Exception{//获得无参构造函数,简单方便
Person p = (Person) Class.forName("com.bird.reflect.Person").newInstance();
System.out.println(p.name);
}
}
看样子反射的力量还是非常伟大的
分享到:
相关推荐
Java反射机制,万物皆对象,class也是一个类的对象,通过类类型,反射获得类的成员属性,构造方法,成员方法,并调用类中的方法,也可以调用私有方法。
编写Student类,类中包含学生姓名,学号等私有数据成员。 使用JAVA反射机制修改一个学生对象的私有数据成员(不允许调用setters)
你可以看到这个类对属性的存取方法(getter and setter method)使用了标准JavaBean命名约定,同时把类属性(field)的访问级别设成私有的(private)。这是推荐的设计,但并不是必须的。Hibernate也可以直接访问...
DumpMethods.java 使用反射机制来获取类中的方法 getClassName.java 利用反射机制获取类的名字 invokeConstructor.java 利用反射机制调用构造器 invokeMethod.java 利用反射机制调用成员方法 listConstructors....
在java中可以可以利用放射机制访问私有的类和方法。。。
031502_【第15章:Java反射机制】_Class类的使用笔记.pdf 031503_【第15章:Java反射机制】_反射应用——取得类的结构笔记.pdf 031504_【第15章:Java反射机制】_Java反射机制的深入研究笔记.pdf 031505_【第15章:...
描述反射机制的作用 62.如何读写一个文件? 63.在图形界面中,一个按钮如何处理鼠标点击事件? 64.在图形界面中,一个表格,如何实现编辑单元格时弹出下拉框? 65.如何加载图片? 66.什么是模态对话框? 67....
162 8.5.8 重写equals方法 163 8.6 final与继承的关系 164 8.7 abstract与继承的关系 165 8.8 什么是多态 166 8.9 什么是枚举类 168 8.10 什么是反射机制 169 8.11 什么是泛型 170 8.12 综合练习 172 8.13 小结 172 ...
5.2 Java中数组的实现机制 61 5.3 数组的初始化 63 5.3.1 默认初始化 63 5.3.2 利用循环初始化 64 5.3.3 枚举初始化 66 5.4 数组的相互赋值 67 5.4.1 基本类型数组赋值规则 67 5.4.2 引用型数组赋值...
所有的持久化类(persistent classes)都要求有无参的构造器,因为Hibernate必须使用Java反射机制来为你创建对象。构造器(constructor)的访问级别可以是private,然而当生成运行时代理(runtime proxy)的时候则...
一是Java的反射机制和自省机制。大部分框架都用到这两种机制,因为它们都要实现通过配置文件自动完成类的识别和加载,所以必须要使用反射和自省。尤其是自省机制,对于大家了解JSP中的一些知识也是很有帮助的。...
} } 发现居然也能调用成功,当时很惊讶,反射机制平时在以前的项目中也常使用,但不能构造只有私有构造函数的类。 自己做了一个简单例子: package study.spring.bean; import java.lang.reflect.Constructor; ...
通过反射调用類的方法,屬性,字段,索引器(2種方法) ASP.NET: State Server Gems 完整的动态加载/卸载程序集的解决方案 从NUnit中理解.NET自定义属性的应用(转载) 如何在.NET中实现脚本引擎 (CodeDom篇) .NET的插件...
10.求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m [Page] 答: int Num = this.TextBox1.Text.ToString() ; int Sum = 0 ; for (int i = 0 ; i ; i++) { if((i%2) == 1) { Sum += i ; ...
2.2.3. 本地方法区(线程私有) ................................................................................................................ 23 2.2.4. 堆(Heap-线程共享)-运行时数据区 .....................
19.2 使用动态特征实现Scala 中的动态调用 397 19.3 关于DSL的一些思考 402 19.4 本章回顾与下一章提要 402 第20章 Scala的领域特定语言 403 20.1 DSL 示例:Scala中XML和JSON DSL 404 20.2 内部DSL...