反射机制在java中如何做呀?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反射机制在java中如何做呀?相关的知识,希望对你有一定的参考价值。

首先大体介绍下反射机制:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 举个简单的列子 import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectTester /** * 通过java的反射机制获取类的所有属性和方法 */ public void test1() try Class c = Class.forName("demo1.client.Customer"); System.out.println("属性:"); Field f[] = c.getDeclaredFields(); for (int i = 0; i < f.length; i++) System.out.println(f[i].getName()); System.out.println("方法:"); Method m[] = c.getDeclaredMethods(); for (int i = 0; i < m.length; i++) System.out.println(m[i].toString()); catch (Throwable e) System.err.println(e); /** * 通过java的反射机制动态修改对象的属性 * @param o */ public void test2(Customer o) try Class c = o.getClass(); //getMethod方法第一个参数指定一个需要调用的方法名称,第二个参数是需要调用方法的参数类型列表,如无参数可以指定null,该方法返回一个方法对象 Method sAge = c.getMethod("setAge", new Class[] int.class ); Method gAge = c.getMethod("getAge", null); Method sName = c.getMethod("setName", new Class[] String.class ); //动态修改Customer对象的age Object[] args1 = new Integer(25) ; sAge.invoke(o, args1); //动态取得Customer对象的age Integer AGE = (Integer) gAge.invoke(o, null); System.out.println("the Customer age is: " + AGE.intValue()); //动态修改Customer对象的name Object[] args2 = new String("李四") ; sName.invoke(o, args2); catch (Throwable e) System.err.println(e); /** * 通过java的反射机制做一个简单对象的克隆 * @param o * @return */ public Object test3(Customer o) Object o2 = null; try Class c = o.getClass(); //通过默认构造方法创建一个新的对象 o2 = c.getConstructor(new Class[] ).newInstance( new Object[] ); Field fields[] = c.getDeclaredFields(); for (int i = 0; i < fields.length; i++) Field field = fields[i]; String fieldName = field.getName(); String firstLetter = fieldName.substring(0, 1).toUpperCase(); // 获得和属性对应的getXXX()方法的名字 String getMethodName = "get" + firstLetter + fieldName.substring(1); // 获得和属性对应的setXXX()方法的名字 String setMethodName = "set" + firstLetter + fieldName.substring(1); // 获得和属性对应的getXXX()方法 Method getMethod = c.getMethod(getMethodName, new Class[] ); // 获得和属性对应的setXXX()方法 Method setMethod = c.getMethod(setMethodName, new Class[] field.getType() ); // 调用原对象的getXXX()方法 Object value = getMethod.invoke(o, new Object[] ); // 调用拷贝对象的setXXX()方法 setMethod.invoke(o2, new Object[] value ); catch (Throwable e) System.err.println(e); return o2; public static void main(String[] args) throws Exception ReflectTester t = new ReflectTester(); t.test1(); Customer customer = new Customer(); customer.setAge(20); customer.setName("张三"); System.out.println("调用前name: " + customer.getName()); System.out.println("调用前age: " + customer.getAge()); t.test2(customer); System.out.println("调用后name: " + customer.getName()); System.out.println("调用后age: " + customer.getAge()); Customer customer2 = (Customer)t.test3(customer); System.out.println("克隆对象的name: " + customer2.getName()); System.out.println("克隆对象的age: " + customer2.getAge()); class Customer private long id; private String name; private int age; public Customer() public Customer(String name, int age) this.name = name; this.age = age; public long getId() return id; public void setId(long id) this.id = id; 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; 你可以自己运行下看看,再修改一些看看 参考技术A java反射详解
本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解。
下面开始正文。
【案例1】通过一个对象获得完整的包名和类名
。。。粘贴不全,请去下面网址学习:

http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html
参考技术B 一句两句说不明白

java反射机制

一、何谓反射机制 

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

二、反射机制如何实现

首先得的是java.lang.Class这个类。

Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。

三、获取Class对象有三种方式: 

1.通过Object类的getClass()方法。例如:

Class c1 = new String("").getClass();

2.通过Class类的静态方法——forName()来实现:

Class c2 = Class.forName("MyObject");

3.如果T是一个已定义的类型的话,在java中,它的.class文件名:T.class就代表了与其匹配的Class对象,例如:

Class c3 = Manager.class;

 

四、Class类中存在以下几个重要的方法: 

1.getName()

一个Class对象描述了一个特定类的特定属性,而这个方法就是返回String形式的该类的简要描述。由于历史原因,对数组的Class对象 

 

2.newInstance()

该方法可以根据某个Class对象产生其对应类的实例。需要强调的是,它调用的是此类的默认构造方法。例如:

MyObject x = new MyObject();

MyObject y = x.getClass().newInstance();

 

3.getClassLoader()

返回该Class对象对应的类的类加载器。

 

4.getComponentType()

该方法针对数组对象的Class对象,可以得到该数组的组成元素所对应对象的Class对象。例如:

int[] ints = new int[]{1,2,3};

Class class1 = ints.getClass();

Class class2 = class1.getComponentType();

而这里得到的class2对象所对应的就应该是int这个基本类型的Class对象。

 

5.getSuperClass()

返回某子类所对应的直接父类所对应的Class对象。

 

6.isArray()

判定此Class对象所对应的是否是一个数组对象。

Class c4 = int.class;

Class c5 = Double[].class;

 

五、反射机制的优点与缺点 

反射机制的优点  就是可以实现动态创建对象和编译,体现出很大的灵活性。 
缺点  对性能有影响。

 

以上是关于反射机制在java中如何做呀?的主要内容,如果未能解决你的问题,请参考以下文章

java反射机制

java反射机制

JAVA 反射机制

java的反射机制

反射机制,反射的性能,如何优化?

java 中反射机制和内省机制的区别是啥?