java--反射
来源:互联网 发布:变色龙引导u盘安装mac 编辑:程序博客网 时间:2024/05/02 02:20
什么是反射
1) java反射机制(java中是没有反射的,但是存在反射机制):程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。从这个观点看,Perl,
Python,Ruby是动态语言,C++,Java,C#不是动态语言。
2)java反射机制定义:
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态
获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
反射的功能
Java反射机制主要提供以下功能:
在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象
的方法;生成动态代理。
反射相关知识
类:用于描述一类事物的共性,该类有什么属性,没有什么属性。
对象:描述这个属性有具体什么值。
Class:所有的类都属于Class,他可以描述类的名字,类的访问属性,类属于那个包,方法名称列表,字段名称列表等一切关于类的信息。
获得Class的一个对象(即返回一个字节码)
User user2 = new User(); //编译时的对象(只要是new的就是) Class c1 = User.class; //没有编译时对象,此时Class相当于所有User类的类的对象 Class c2 = user2.getClass();//有编译时对象user2,获得运行时对象c1 Class c3 = Class.forName("org.jsoft.text.User");//如果内存中有则直接返回,没有JVM新加载一个
在JDK中有9个预定义的Class类实例:
byte,char,short,int,long,float,double,boolean,void
Class c7 =int.class;Class c8 =integer.class;System.out.println(c7==c8);//falseSystem.out.println(c7==Integer.TYPE);//true获得一个对象以后想访问属性
Constructor类:
Consructor[] c7 =User.class.getConstructors();//获得所有的构造器Class<User> clazz =User.class;Consructor<User> c =clazz.getConstructor(String.class);//获得某个构造器User user = c.newInstance("hello");//这两句话等同于User user = new User("hello");创建对象user.a();//调用方法Field fieldUsername =clazz.getField("username");//必须是public的属性
如果属性是私有的,必须通过以下代码进行暴力反射才可以访问
Class<User> clazz =User.class;Consructor<User> c =clazz.getConstructor(String.class);//获得某个构造器User user = c.newInstance("ivan");Field fieldUsername =clazz.getDeclaredField("username");fieldUsername.setAccessible(true);System.out.println(fieldUsername.get(user));//这个user必须是运行时的,且有get/set方法
获得方法
<pre name="code" class="java">Class<User> clazz =User.class;Consructor<User> c =clazz.getConstructor(String.class);//获得某个构造器User user = c.newInstance("ivan");Method m = clazz.getMethods();//获得全部的方法;Method m = clazz.getMethod("a","int.class");//方法名,参数类型m.invoke(user,10);//访问方法(对象,参数值)m.invoke(null,10);//表示该方法为静态方法,参数有就填,没有不填内省(Introspector)
如果一个类,只要简单的属性以及相对应的set/get方法,我们称这个类为JavaBean.在JDK中专门提供一些对于JavaBean操作的包(java.beans).称为内省。
JavaBean主要用于两个模块之间进行传值。我们称这个为JavaBean为VO(value object)只提供属性名称给JavaBean赋值最简单的办法。
Java代理:
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户
端和目标对象之间起到中介的作用。
代理模式的角色:
1)抽象角色:声明真实对象和代理对象的共同接口
2)代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。
同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
3)真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
获得类对象应用的三种方式:
①Class c1=ArrayList.class;
②Object l=new ArrayList();
Class c2=l.getClass();
③StringclassName="java.util.ArrayList";
Class c3=Class.forName(className);
Class[] cs=c1.getInterfaces();//获得接口
Class c=Animal.class;
Field[] fs=c.getDeclaredFields();//获得属性的数组
Method[] ms=c.getDeclaredMethods();//获得本类所有公私有的方法,getMethods()获得父类所有公开的方法
Constructor[]cons=c.getDeclaredConstructors();//获得构造方法的数组
Object o2=c.newInstance();//创建类的对象
Methodm1=c.getDeclaredMethod("study");//找到方法名是study的方法
m1.setAccessible(true);//设置为可以调用
m1.invoke(o2);//调用m1方法
Methodm2=c.getDeclaredMethod("study", String.class);
m2.setAccessible(true);
m2.invoke(o2,"CoreJava");//调用m2的方法,方法的参数是CoreJava
- 【反射】JAVA反射机制
- JAVA 反射
- java 反射
- Java反射
- java反射
- java反射
- JAVA反射
- java 反射
- Java 反射
- java 反射
- Java反射
- java反射
- JAVA 反射
- java 反射
- Java反射
- java反射
- java 反射
- java 反射
- [leetcode] 97 Interleaving String
- STL系列--- 随机三趣题——随机重排,文件中随机取一行,生成N个随机数。
- 我为什么开始写博客
- POJ 3087Shuffle'm Up
- leetcode--179:Largest Number
- java--反射
- 重构笔记——将类内联化
- 热门智力题 过桥问题和倒水问题
- 十天学Linux内核之第七天---电源开和关时都发生了什么
- 树的非递归深度优先遍历
- 2015年1月26日 星期一 [iOS]UIwebview左右滑動回上一頁
- poj1742 dp
- CoreText 使用教程:以创建一个简单的杂志应用为例
- 二叉树的建立与遍历-数组模拟和链表模拟