java的反射机制
2015-07-27 12:14
302 查看
在学习之前,先来看看百度百科是怎么解释它的吧:
什么是java的反射:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
java的反射能够做什么:
Java反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法;生成动态代理。
反射类的属性、构造方法、父类、接口和方法
java的反射的用法:
详细用法 ,代码中有注释。我们可以通过反射来获取某个类的变量,方法,构造函数等信息;
比如我们在开发Android的时候 ,在就得api中是不包含某个函数的,所以 我们可以通过反射机制,在运行的过程中 查找是否含有这个方法。
如果我们想访问某个类的私有变量,也可以用反射获得。
什么是java的反射:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
java的反射能够做什么:
Java反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法;生成动态代理。
反射类的属性、构造方法、父类、接口和方法
java的反射的用法:
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class test { public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { demo1 demo = new demo1(); Class a = demo.getClass(); //取得demo的out 方法 Method method = a.getMethod("out"); // System.out.println(method.toString() + ""); //反射输出 out() // method.invoke(demo,null); //获得demo1的所有方法,包括父类的方法 Method[] m = a.getMethods(); // for(int i = 0 ;i < m.length ; i++){ // System.out.println(m[i].toString() + ""); // } // Method[] me = a.getDeclaredMethods(); // for(int i = 0 ;i < me.length ; i++){ // System.out.println(me[i].toString() + ""); // } Class b = demo1.class; try { Class c = Class.forName("test.demo1"); demo1 object = (demo1)c.newInstance(); object.out(); Method[] method1 = a.getDeclaredMethods(); for(int i = 0 ;i < method1.length ; i++){ System.out.println(method1[i].toString() + ""); } //获得构造函数 Constructor[] theConstructors = c.getConstructors(); System.out.println("构造函数的数量:" + theConstructors.length ); //获得类的所有公共的屬性 Field[] fb =c.getFields(); for ( int j= 0 ;j<fb.length;j++){ Class cl = fb[j].getType(); System.out.println("fb:" +cl); } System.out.println("反射类中所有的属性" ); Field[] fa = c.getDeclaredFields(); for ( int j= 0 ;j<fa.length;j++){ String cl = fa[j].getName(); System.out.println("fa:" +cl); } System.out.println("反射类中私有属性的值" ); Field f = c.getDeclaredField("b"); f.setAccessible(true ); Integer i = (Integer)f.get(object); System.out.println(i); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } class demo1 { public demo1(){ } public int a = 1; private int b = 2; public void out() { System.out.println("out。。。"); } public void init(){ System.out.println("a = " + a); } }
详细用法 ,代码中有注释。我们可以通过反射来获取某个类的变量,方法,构造函数等信息;
比如我们在开发Android的时候 ,在就得api中是不包含某个函数的,所以 我们可以通过反射机制,在运行的过程中 查找是否含有这个方法。
如果我们想访问某个类的私有变量,也可以用反射获得。
相关文章推荐
- Java calendar DEMO
- 让spring mvc controller转换date类型
- Spring学习总结
- [Spring MVC] - SpringMVC的各种参数绑定方式
- 深入理解JavaI/O流
- final in Java DEMO
- Java开发常用必备工具下载一定要收藏不然以后不好找
- java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp区别和总结
- Struts2与servlet共存的解决方案
- 实时计算知多少?
- myeclipse6.5注册码2015年3个最新的
- JDK版本不兼容问题之:一台机器安装多个版本的JDK
- spring3 jdbctemplate 注解实例(有时间字段转换的方法) .
- Java开发常用必备工具下载一定要收藏不然以后不好找
- Java设计模式——六大原则
- JAVA学习课第五十三届 — IO流程(七)File打靶 & Properties设置
- spring中创建bean对象时多例和单例的区别
- java总结输入流输出流
- 有关struts.xml的地址和中文编码乱码问题
- 断点调试 android 程序 (Eclipse)