知识大全 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反射机制的应用例子

Java反射机制的应用例子  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  目标用一个代理类实现两

知识大全 Java反射机制中常用API

Java反射机制中常用API  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Class是Refl

知识大全 Java反射机制获取内部类的静态成员

Java反射机制获取内部类的静态成员  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  最近需要些一

知识大全 谁来帮用通俗易懂的语言解释下java的反射机制

谁来帮用通俗易懂的语言解释下java的反射机制JavaReflactioninAction有这么一句话,可以解释。反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变。通俗的讲就

知识大全 JVM技术,反射与动态代理

JVM技术,反射与动态代理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java程序的工作机制

知识大全 Java Reflection (JAVA反射)详解

JavaReflection(JAVA反射)详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 java反射Annotation

java反射Annotation  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  importja

知识大全 实用的Java反射工具类

实用的Java反射工具类  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  反射的Utils函数集合

知识大全 Java动态程序设计——反射介绍

Java动态程序设计——反射介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java动态程序

知识大全 JavaME程序 Run Anywhere-- 利用反射机制来动态加载声

JavaME程序RunAnywhere--利用反射机制来动态加载声  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一