知识大全 java反射机制
Posted 函数
篇首语:不塞不流,不止不行。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 java反射机制相关的知识,希望对你有一定的参考价值。
JAVA反射机制是在运行状态中 对于任意一个类 都能够得到这个类的所有属性和方法;对于任意一个对象 都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制
概括一下:
反射就是让你可以通过名称来得到对象(类 属性 方法)的技术
例如我们可以通过类名来生成一个类的实例;
知道了方法名 就可以调用这个方法;知道了属性名就可以访问这个属性的值
获取类对应的Class对象
运用(已知对象)getClass():Object类中的方法 每个类都拥有此方法
如: String str = new String();
Class strClass = str getClass();运用(已知子类的class) Class getSuperclass():Class类中的方法 返回该Class的父类的Class;运用(已知类全名):Class forName() 静态方法运用(已知类): 类名 class
通过类名来构造一个类的实例
a 调用无参的构造函数:
Class newoneClass = Class forName(类全名); newoneClass newInstance();
b 调用有参的构造函数 我们可以自定义一个函数
public Object newInstance(String className Object[] args) throws Exception
//args为参数数组
Class newoneClass = Class forName(className); //得到参数的Class数组(每个参数的class组成的数组) 由此来决定调用那个构造函数Class[] argsClass = new Class[args length]; for (int i = j = args length; i < j; i++) argsClass[i] = args[i] getClass();
Constructor cons = newoneClass getConstructor(argsClass); //根据argsClass选择函数return cons newInstance(args); //根据具体参数实例化对象
得到某个对象的属性
a 非静态属性:首先得到class 然后得到这个class具有的field 然后以具体实例为参数调用这个field
public Object getProperty(Object owner String fieldName) throws Exception Class ownerClass = owner getClass();//首先得到class Field field = ownerClass getField(fieldName); //然后得到这个class具有的field 也可以通过getFields()得到所有的field Object property = field get(owner); //owner指出了取得那个实例的这个属性值 如果这个属性是非公有的 这里会报IllegalAccessException
return property;
b 静态属性
只有最后一步不同 由于静态属性属于这个类 所以只要在这个类上调用这个field即可Object property = field get(ownerClass);
执行某对象的方法
public Object invokeMethod(Object owner String methodName Object[] args) throws Exception Class ownerClass = owner getClass(); //也是从class开始的//得到参数的class数组 相当于得到参数列表的类型数组 来取决我们选择哪个函数
Class[] argsClass = new Class[args length]; for (int i = j = args length; i < j; i++) argsClass[i] = args[i] getClass();
//根据函数名和函数类型来选择函数
Method method = ownerClass getMethod(methodName argsClass); return method invoke(owner args);//具体实例下 具体参数值下调用此函数
执行类的静态方法
和上面的相似只是最后一行不需要指定具体实例
return method invoke(null args);
判断是否为某个类的实例
public boolean isInstance(Object obj Class cls) return cls isInstance(obj);
测试bean类:SimpleBean java
Java代码
package royzhou bean;
public class SimpleBean
private String name;
private String[] hobby;
public SimpleBean()
public SimpleBean(String name String[] hobby) this name = name; this hobby = hobby;
public void setName(String name)
this name = name;
public String getName()
return this name;
public void setHobby(String[] hobby)
this hobby = hobby;
public String[] getHobby()
return this hobby;
public String toString()
String returnValue = super toString() + \\n ; returnValue += name:= + this name + \\n ; if(this hobby != null)
returnValue += hobby: ;
for(String s : this hobby) returnValue += s + ;
returnValue += \\n ;
return returnValue;
package royzhou bean;
public class SimpleBean
private String name;
private String[] hobby;
public SimpleBean()
public SimpleBean(String name String[] hobby) this name = name; this hobby = hobby;
public void setName(String name)
this name = name;
public String getName()
return this name;
public void setHobby(String[] hobby)
this hobby = hobby;
public String[] getHobby()
return this hobby;
public String toString()
String returnValue = super toString() + \\n ; returnValue += name:= + this name + \\n ; if(this hobby != null)
returnValue += hobby: ;
for(String s : this hobby) returnValue += s + ;
returnValue += \\n ;
return returnValue;
反射测试类:ReflectTest java
Java代码
package royzhou bean;
import java lang reflect Constructor; import java lang reflect Field; import java lang reflect Method;
public class ReflectTest
public static void main(String[] args) throws Exception
Class clazz = SimpleBean class;
//使用无参构造函数实例化bean
SimpleBean sb = (SimpleBean)clazz newInstance(); System out println(sb);
//使用有参构造函数实例化bean
Constructor constructor = clazz getConstructor(new Class[]String class String[] class); sb = (SimpleBean)constructor newInstance(new Object[] royzhou new String[] football basketball ); System out println(sb);
//为name字段设置值
Field field = clazz getDeclaredField( name ); field setAccessible(true); //避免private不可访问抛出异常field set(sb royzhou ); System out println( modify name using Field:= + sb getName() + \\n );
//列出类SimpleBean的所有方法
Method[] methods = clazz getDeclaredMethods(); System out println( get methods of class SimpleBean: );
for(Method method : methods)
if( setHobby equals(method getName()))
//动态调用类的方法来为hobby设置值
method invoke(sb new Object[]new String[] tennis fishing );
System out println(method getName());
System out println( \\nset by invoke Method ); System out println(sb);
package royzhou bean;
import java lang reflect Constructor; import java lang reflect Field; import java lang reflect Method;
public class ReflectTest
public static void main(String[] args) throws Exception
Class clazz = SimpleBean class;
//使用无参构造函数实例化bean
SimpleBean sb = (SimpleBean)clazz newInstance(); System out println(sb);
//使用有参构造函数实例化bean
Constructor constructor = clazz getConstructor(new Class[]String class String[] class); sb = (SimpleBean)constructor newInstance(new Object[] royzhou new String[] football basketball ); System out println(sb);
//为name字段设置值
Field field = clazz getDeclaredField( name ); field setAccessible(true); //避免private不可访问抛出异常field set(sb royzhou ); System out println( modify name using Field:= + sb getName() + \\n );
//列出类SimpleBean的所有方法
Method[] methods = clazz getDeclaredMethods(); System out println( get methods of class SimpleBean: );
for(Method method : methods)
if( setHobby equals(method getName()))
//动态调用类的方法来为hobby设置值
method invoke(sb new Object[]new String[] tennis fishing );
System out println(method getName());
System out println( \\nset by invoke Method ); System out println(sb);
输出结果:
royzhou bean SimpleBean@ aef
name:=null
royzhou bean SimpleBean@d f c
name:=royzhou
hobby:football basketball
modify name using Field:=royzhou
get methods of class SimpleBean:
setHobby
getHobby
getName
toString
setName
set by invoke Method
royzhou bean SimpleBean@d f c
name:=royzhou
cha138/Article/program/Java/hx/201311/26612相关参考
Java反射机制的应用例子 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 目标用一个代理类实现两
Java反射机制中常用API 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Class是Refl
Java反射机制获取内部类的静态成员 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 最近需要些一
谁来帮用通俗易懂的语言解释下java的反射机制JavaReflactioninAction有这么一句话,可以解释。反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变。通俗的讲就
JVM技术,反射与动态代理 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java程序的工作机制
知识大全 Java Reflection (JAVA反射)详解
JavaReflection(JAVA反射)详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
java反射Annotation 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! importja
实用的Java反射工具类 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 反射的Utils函数集合
Java动态程序设计——反射介绍 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java动态程序
知识大全 JavaME程序 Run Anywhere-- 利用反射机制来动态加载声
JavaME程序RunAnywhere--利用反射机制来动态加载声 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一