Java反射(一)
2015-06-04 21:28
459 查看
Java的反射机制可以在运行时再装配代码,使程序的编写更加灵活.(高大上,看起来就很厉害的样子,然而到底有什么用呢?)
Java的反射机制可以访问一个未知对象的属性,方法,构造方法(有参or无参),
实现Java的反射共有三种方法:
我们主要掌握第一种.
下面来个Demo:
我们来看看Class.forName()方法:
Class.forName()的主要任务就是把指定路径的类装载到jvm中.
这里判断了对象的访问权限,如果访问对象修饰符为 private,需要禁止Field的访问控制检查,, boolean)]setAccessible设置为true.
然后,newInstance(),代码太长,可以自己去看看.要使用这个方法必须在对应类加载并连接的状态下,而前面的Class.forName()就保证了newInstance的使用满足条件.(正是在这里调用Class的方法,从而获得了更好的灵活性.)
Java的反射机制可以访问一个未知对象的属性,方法,构造方法(有参or无参),
实现Java的反射共有三种方法:
1.通过forName()方法;
2.x.class;
3.x.getClass()。
我们主要掌握第一种.
下面来个Demo:
public static void main(String[] args) throws Exception { reflectTest(); reflectTest2("Tom","Cat"); reflectTest3("Ben","Dog"); reflectTest4(); } public static void reflectTest() throws Exception { System.out.println("1"); Class tclass2 = Class.forName("reflect.bean.Pet"); Object obj = tclass2.newInstance();// 调用非静态new 一个对象,调用静态方法则不需要 } public static void reflectTest2(String name, String kind) throws Exception { System.out.println("2"); Class tclass = Class.forName("reflect.bean.Pet"); Constructor con = tclass.getConstructor(String.class, String.class); con.newInstance(name, kind); } public static void reflectTest3(String name, String kind) throws Exception{ System.out.println("3"); Class tclass = Class.forName("reflect.bean.Pet"); Object obj =tclass.newInstance(); Method met=tclass.getMethod("PetInfo", String.class,String.class); met.invoke(obj, name,kind); } public static void reflectTest4() throws Exception { System.out.println("4"); Class tclass2 = Class.forName("reflect.bean.Pet"); Object obj = tclass2.newInstance(); Method met =tclass2.getMethod("PetInfo", null); met.invoke(obj, null); }Pet类
package reflect.bean; public class Pet { private String kind; private String name; public Pet(String kind, String name) { super(); this.kind = kind; this.name = name; System.out.println("Pet---" + kind + "---" + name); } public Pet() { super(); System.out.println("Pet"); } public void PetInfo() { System.out.println("tom---Cat"); } public void PetInfo(String kind, String name) { System.out.println(name + "---" + kind); } }输出结果:
1 Pet 2 Pet---Tom---Cat 3 Pet Dog---Ben 4 Pet tom---Cat
我们来看看Class.forName()方法:
public static Class<?> forName(String className) throws ClassNotFoundException { return forName0(className, true, ClassLoader.getCallerClassLoader()); }
Class.forName()的主要任务就是把指定路径的类装载到jvm中.
static ClassLoader getCallerClassLoader() { // NOTE use of more generic Reflection.getCallerClass() Class caller = Reflection.getCallerClass(3); // This can be null if the VM is requesting it if (caller == null) { return null; } // Circumvent security check since this is package-private return caller.getClassLoader0(); }
这里判断了对象的访问权限,如果访问对象修饰符为 private,需要禁止Field的访问控制检查,, boolean)]setAccessible设置为true.
static void | , boolean)]setAccessible(AccessibleObject[] array, boolean flag) 使用单一安全性检查(为了提高效率)为一组对象设置 accessible标志的便捷方法。 |
相关文章推荐
- Java for LeetCode 145 Binary Tree Postorder Traversal
- JAVA_连接池、DataSource、JNDI
- Java学习笔记(十):Java中的JNDI
- Struts2入门实例
- Java for LeetCode 144 Binary Tree Preorder Traversal
- Java I/O : Bit Operation 位运算
- Java I/O : Bit Operation 位运算
- Javah 使用时报错:找不到类
- Spring mvc 过滤器
- JAVA基础——IO流
- java 读取配置文件内容
- Java 判断操作系统类型(适用于各种操作系统)
- Java for LeetCode 143 Reorder List
- java将XML文档转换成json格式数据
- spring security 3.x 多页面登录配置入门教程
- openjdk源码加载到eclipse中
- Java知多少(82)标签、按钮和按钮事件简介
- 学习Launcher之了解src文件夹下的各个javaClass的作用
- Java for LeetCode 142 Linked List Cycle II
- java-IO流(中)