反射机制之运用
来源:互联网 发布:淘宝退货地址哪里设置 编辑:程序博客网 时间:2024/05/29 11:10
一.概述反射:
反射:能够在运行状态下分析类能力的程序,
类:包括域(field),方法(method),构造器(constructor),
故反射可以用来:1.可以在运新状态下分析类的能力,即类中的域,方法,构造器
2.可以在运新状态下查看对象,并创建对象
3.实现通用的数组操作
二.Class类
在J程序期间,Java运行时系统始终为所用的对象维护一个类型标识,跟踪者对象所属的类,虚拟机再选择类所属的方法进行编译执行,
(1)类的实例获取方法:
class People{
private String name;
private int age;
private String sex;
public People(String name, int age, String sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
public People(){
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
方法一:Object的getClass()方法获取Class类型的实例/对象:People p; Class c1=p.getClass()-->Class类型的实例,
方法二:静态方法forName()获取类型对应的对象,String className="People",Class c2=Class.forName(className);
方法三:T.class,T为任意Java类型,借助方法一,Class c3=c1.getName().class,c1.getName()为类p所在类的名字People,即Classc3=People.class
(2).构建一个新的对象:Object newInstance(Object[] args),
Objectp1= p.getClass().newInstance(),构建了一个无参p1对象,与p的对象类型一致
三.反射分析类的能力
反射分析类的能力即:域(成员变量),方法,构造器对应java.lang.reflect的三个类:Field,Method,Constructor
1.Field类
java.lang .Class
(1).Field[] getFields()-->返回一个包含Field对象的数组,这些对象记录了这个类或其超类的公有域
(2).Field[] getDeclaredFields();-->仅这个类或接口的全部方法
(3)Field getField(String name)-->返回指定名称的公有域
(4)Field getDeclaredField()-->返回指定类中声明的指定名称的域
java.lang.reflect.AccessibleObject
(1)void setAccessibe(boolean flag)-->为反射对象设置可访问标志,true:屏蔽java语言的访问检查,可以访问private,false:默认值,不屏蔽
(2)boolean isAccessible()-->返回反射对象的可访问标志的值
(3)Static void setAccessible(AccessibleObjec[] array,boolean flag)-->设置对象数组的可访问标志,true:屏蔽java语言的访问检查
java.lang.reflect.Field
Object get(Object obj)-->返回obj对象中用Field对象表示的域值
void set(Object obj,Object newValue)-->设置Object对象中Field对象表示的域值
getType();-->返回对应域的类型
getName();-->返回对应域的域名
java.lang.reflect.Modifier
static boolean isAbstract(int modeifiers);
static boolean isFinal(int modeifiers);
static boolean isInterface(int modeifiers);
static boolean isNative(int modeifiers);
static boolean isPrivate(int modeifiers);
static boolean isDouble(int modeifiers);
static boolean isStatic(int modeifiers);
static boolean isSychtonized(int modeifiers);
static boolean isStrict(int modeifiers);
实例:
People p1=new People("lilei",23,"woman");
Class c=p1.getClass();//People 在包com.cn下创建,结果为class com.cn.People
Field[] fields=c.getDeclaredFields();//得到People类下所有的域
AccessibleObject.setAccessible(fields,true);//设置对象数组的可访问标志,用于访问private
for(Field f:fields){
String modifiers=Modifier.toString(f.getModifiers());//修饰符private'
if(modifiers.length()>0){
System.out.println("field中modifiers:"+modifiers);
}
String name=f.getName();//域名,name,age,sex
System.out.println("域名为:"+name);
Class type=f.getType();//域的类型
type.isPrimitive();//用于检测是否如下类型: byte, char, short, int, long, float, and double
System.out.println("field中的type为:"+type);
try {
Object value=f.get(p1);//域值为:lilei",23,"woman"
System.out.println("values的值为:"+value);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
2.Method类
java.lang.Class
(1).Method[] getMethods()-->返回一个包含Method对象的数组,这些对象记录了这个类或其超类的公方法
(2).Method[]getDeclaredMethods();-->仅这个接口或方法的全部方法
java.lang.Method
(3) public Object invoke(Object inplitParameter,Object[] explicitParameters)-->调用这个对象所描述的方法,(4)getParameterTypes()
(5).getReturnType();//返回方法的返回值类型
传递给定参数,并返回方法的返回值,对于静态方法,把null作为隐式参数传递在使用包装器传递基本类型的值时,
基本类型返回值必须为未包装的
实例:
People p1=new People("lilei",23,"woman");
Class c=p1.getClass();
Method[] methods=c.getDeclaredMethods();
for(Method m : methods){
Class retunType=m.getReturnType();//返回方法的返回值类型
String name=m.getName();//获取方法名
System.out.println("Class中method的名称:"+name);
String modifiers=Modifier.toString(m.getModifiers());//说明符public
if(modifiers.length()>0){
System.out.println("mehtod中modifiers的值为:"+modifiers);
}
System.out.println("retunType的name为:"+retunType.getName());
Class[] paraTypes=m.getParameterTypes();//获取方法的参数
for(Class paraType:paraTypes){
System.out.println("method参数类型为:"+paraType.getName());
}
3.Constuctor类
java.lang.Class
(1).Constuctor[] getConstructors()
(2).Constuctor[]getDeclaredConstructors();-->返回一个Constuctor对象的数组,其中包括了Class对象所描述的类的所有构造器
People p1=new People("lilei",23,"woman");
Class c=p1.getClass();
Constructor[] constructors=c.getDeclaredConstructors();for(Constructor con:constructors){
String modifiers=Modifier.toString(con.getModifiers());
if(modifiers.length()>0){
System.out.println("构造器中modifiers:"+modifiers);
}
String name=con.getName();//获取无参构造器的名称
System.out.println("构造器名称为:"+name);
Class[] types=con.getParameterTypes();//获取无参构造器的参数类型
for(Class type:types){
System.out.println("constructor中的type为:"+type);
}
- 反射机制之运用
- 反射机制的运用
- 反射机制的运用
- C#反射机制小运用
- java反射机制和运用
- java反射机制的运用
- JAVA 反射机制简单运用
- java反射机制的运用
- JAVA反射机制运用教程
- 运用反射机制的JDBC封装
- 反射机制在tomcat中的运用
- Java反射机制 以及 method.invoke运用
- Android——反射Reflect机制运用
- 运用反射机制捕获类的原型
- Java反射机制的运用-Json解析
- Java 之反射机制
- 反射机制之Array
- java之反射机制
- 自响应式企业网站源码MVC源码
- 键、索引、约束及其区别
- POJ
- caffe2--Toy Regression(五)
- HDFS中读写文件流程
- 反射机制之运用
- 1207: [HNOI2004]打鼹鼠
- Java中array、Set、List和Map的比较总结
- Linux--进程--僵尸进程
- SpringMVC拦截器实现登录
- RabbitMQ Network Partitions 服务日志对比
- DZNEmptyDataSet空白数据集显示框架简单使用
- Springmvc第一讲学习笔记,数据接收与乱码解决
- css3@media规则