Java反射
来源:互联网 发布:淘宝店铺手机怎么登陆 编辑:程序博客网 时间:2024/05/24 07:44
反射机制的作用:
- 在运行中分析类的能力
- 在运行中查看对象
- 实现通用的数组代码
Class类
获取CLass实例:
- Object类中的getClass方法会返回一个Class类型的实例
例如:Class cl =user.getClass()
getName方法:返回类的名字,例如下面的语句:
cl.getName();
输出的是:com.sendi.entity.User
2.forName(String)方法:获得类名对应的CLass对象,例如
String className="com.sendi.entity.User";Class cl=Class.forName(className);
3.T.class:
Class cl1=int.class; Class cl2=double.class;
newInstance()方法:可以方便快捷地创建一个对象出来,例如:
User user3=u.getClass().newInstance();
如果构造器有参数,则需要使用Constructor类中的newInstance方法。
getFields方法:返回Field数组
getMethods方法:返回Method数组
getConstructors方法:返回Constructor数组
getDeclareFields方法:返回类中声明的全部域
getDeclareMethods方法:返回类中声明的全部方法
getDeclareConstructors方法:返回Constructor
其中包括私有的和受保护的成员,但不包括超类。
利用反射分析类的能力
在java.lang.reflex包中有三个类:Field、Method和Constructor,他们分别用于描述类的域、方法、构造器。他们都有一个getName的方法,用来返回项目的名称。
- Field类:
提供public域
getModifiers():返回一个整形数值,可供Modifiers.toString方法分析出修饰符 - Method类:
提供方法
getModifiers():返回一个整形数值,可供Modifiers.toString方法分析出修饰符
Class getReturnType():返回方法返回的类型 - Constructor类:
提供构造器
getModifiers():返回一个整形数值,可供Modifiers.toString方法分析出修饰符
Class getDeclaringClass():返回一个描述类中定义的构造器、方法或域的Class对象。
Class[] getParameterTypes():返回描述构造器参数类型数组。
例子,分析类中的所有成员:
public class Demo2 { /** * @param args */ public static void main(String[] args) { String name; if(args.length>0)name=args[0]; else{ Scanner in=new Scanner(System.in); System.out.println("enter class name(e.g.java.util.Date)"); name=in.next(); } try { Class cl=Class.forName(name); Class superCl=cl.getSuperclass(); String modifiers=Modifier.toString(cl.getModifiers()); if(modifiers.length()>0)System.out.print(modifiers+" "); System.out.print("class "+name); if (superCl!=null && superCl!=Object.class) System.out.print(" extends "+superCl.getName()); System.out.print("\n{\n"); printConstuctors(cl); System.out.println(); printMethods(cl); System.out.println(); printFields(cl); System.out.println("}"); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } System.exit(0); } private static void printFields(Class cl) { // TODO Auto-generated method stub Field[] fields=cl.getDeclaredFields(); for (Field field : fields) { Class type=field.getType(); String name=field.getName(); System.out.print(" "); String modifiers=Modifier.toString(field.getModifiers()); if(modifiers.length()>0)System.out.print(modifiers+" "); System.out.println(type.getName()+" "+name+";"); } }/** * 打印方法 * @param cl */ private static void printMethods(Class cl) { // TODO Auto-generated method stub Method[] methods=cl.getMethods(); for (Method method : methods) { Class retType=method.getReturnType(); String name=method.getName(); System.out.print(" "); String modifiers=Modifier.toString(method.getModifiers()); if(modifiers.length()>0)System.out.print(modifiers+" "); System.out.print(retType.getName()+" "+name+"("); Class[] paramType=method.getParameterTypes(); for(int i=0;i<paramType.length;i++){ if(i>0)System.out.print(", "); System.out.print(paramType[i].getName()); } System.out.println(");"); } }/** * 打印构造方法 * @param cl */ private static void printConstuctors(Class cl) { // TODO Auto-generated method stub Constructor[] constructors=cl.getConstructors(); for (Constructor constructor : constructors) { String name=constructor.getName(); System.out.print(" "); String modifiers=Modifier.toString(constructor.getModifiers()); if(modifiers.length()>0)System.out.print(modifiers+" "); System.out.print(name+"("); //参数 Class[] paramTypes=constructor.getParameterTypes(); for(int i=0;i<paramTypes.length;i++){ if(i>0)System.out.print(", "); System.out.print(paramTypes[i].getName()); } System.out.println(")"); } }}
在运行时使用反射
–
Field类中的get方法:获取该域的当前值,例如:
User user=new User("asendi",11); Class cl=user.getClass(); Field f01=cl.getDeclaredField("name");//name域 f01.setAccessible(true);//设置访问权限 Object obj=f01.get(user); System.out.println(obj.toString());
打印结果是:asendi
注意:当name是私有时,则必须加f01.setAccessible(true)来设置访问权限。
Field类中的set方法:用来设置当前域的值,例如:
Field f02=cl.getDeclaredField("age");//age域 f02.setAccessible(true); Integer age=f02.getInt(user); System.out.println("before:"+age); f02.set(user, 22); Integer age2=f02.getInt(user); System.out.println("after:"+age2);
输出结果是:
before:11 after:22
java.lang.reflect.Array
Object get(Object array,int index):返回指定数组对象中索引的值。
void set(Object array,int index):给指定数组对象中索引的对象指定新值。
int getLength(Object array):返回指定数组的长度。
Object newInstance(Class componentType,int length):返回一个具有给定类型,给定长度的新数组。
Object newInstance(Class componentType,int… length):创建具有指定组件类型和维度的新数组。
下面给出一个数组拷贝的方法:
public static Object goodCopyOf(Object a,int newLength){ Class cl=a.getClass(); if(!cl.isArray())return null; Class componentType=cl.getComponentType(); int length=Array.getLength(a); Object newArray=Array.newInstance(componentType, newLength); System.arraycopy(a, 0, newArray, 0, Math.max(newLength, length));//拷贝数组 return newArray; }
调用方法
获取Method方法,例如:
Method m=User.class.getMethod("getAge");
invoke(Object obj,Object… paramenters):调用这个对象所描述的方法,并返回该方法的返回值。例如:
User u=new User("sendi",20); Method m=User.class.getMethod("getAge"); int age=(Integer) m.invoke(u); System.out.println("age::"+age);
打印结果:age::20
Ok,关于反射的节本知识点暂时结束。
- 【反射】JAVA反射机制
- JAVA 反射
- java 反射
- Java反射
- java反射
- java反射
- JAVA反射
- java 反射
- Java 反射
- java 反射
- Java反射
- java反射
- JAVA 反射
- java 反射
- Java反射
- java反射
- java 反射
- java 反射
- C#事件中sender的小用法
- 下拉选择框
- hystrix 1.5.13 学习笔记
- 线程池原理(五):CompletionService
- 10款优秀的vim插件
- Java反射
- MySQL 数据库优化的八种方式
- Oracle 11g利用DBCA创建数据库
- ubuntu更换阿里源
- IOS 元素定位工具
- InfoSphere DataStage 运行时列扩展(RCP)在 ETL 中的应用
- Pat(A) 1094. The Largest Generation (25)
- activiti学习--05流程实例:部署流程定义+部署流程定义+查询当前人的个人任务+完成我的任务
- Linux 网络配置文件笔记