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

概括一下:

反射就是让你可以通过名称来得到对象(类,属性,方法)的技术。

例如我们可以通过类名来生成一个类的实例;

知道了方法名,就可以调用这个方法;知道了属性名就可以访问这个属性的值。

1、获取类对应的Class对象

运用(已知对象)getClass():Object类中的方法,每个类都拥有此方法。

如: String str = new String();

Class strClass = str.getClass();运用(已知子类的class) Class.getSuperclass():Class类中的方法,返回该Class的父类的Class;运用(已知类全 名):Class.forName() 静态方法运用(已知类): 类名.class

2、通过类名来构造一个类的实例

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 = 0, j = args.length; i < j; i++) { argsClass[i] = args[i].getClass();

}

Constructor cons = newoneClass.getConstructor(argsClass); //根据argsClass选择函数return cons.newInstance(args); //根据具体参数实例化对象。

}

3、得到某个对象的属性

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);

4、执行某对象的方法

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 = 0, j = args.length; i < j; i++) { argsClass[i] = args[i].getClass();

}

//根据函数名和函数类型来选择函数

Method method = ownerClass.getMethod(methodName, argsClass); return method.invoke(owner, args);//具体实例下,具体参数值下调用此函数

}

5、执行类的静态方法

和上面的相似只是最后一行不需要指定具体实例

return method.invoke(null, args);

6、判断是否为某个类的实例

public boolean isInstance(Object obj, Class cls) { return cls.isInstance(obj);

}

测试bean类:SimpleBean.java

Java代码

package com.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 com.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 com.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, "royzhou1985"); 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 com.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, "royzhou1985"); 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);

}

}

输出结果:

com.royzhou.bean.SimpleBean@757aef

name:=null

com.royzhou.bean.SimpleBean@d9f9c3

name:=royzhou

hobby:football,basketball,

modify name using Field:=royzhou1985

get methods of class SimpleBean:

setHobby

getHobby

getName

toString

setName

set by invoke Method

com.royzhou.bean.SimpleBean@d9f9c3

name:=royzhou1985

hobby:tennis,fishing,

java 反射的实例的更多相关文章

  1. java反射技术实例

    java反射技术实例​1. [代码][Java]代码     package com.gufengxiachen.java.reflectiontest; public class Person {p ...

  2. java 反射创建实例与new创建实例的区别

    new创建实例 new创建一个编译时已知的类的实例,也即是静态的创建实例: 可以调用类的任何构造器来创建实例: 速度更快,由于可以将需要的类写入字节文件中(hardcoded into the byt ...

  3. Java反射的实例

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

  4. Java反射机制实例解析

    1.获取想操作的访问类的java.lang.Class类的对象     2.调用Class对象的方法返回访问类的方法和属性信息     3.使用反射API来操作      每个类被加载后,系统会为该类 ...

  5. java反射机制实例

    1.通过数据库字段反射给对象实例赋值 convertClass.java /** * 通过反射构造对象 * @param obj * @param rs * @return */ public Obj ...

  6. java反射简单实例

    这篇博友的总结的反射知识点是比较全面的 http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html 下面介绍我用反射做的两个功能 ...

  7. java反射小实例

    利用反射实现 对配置文件的更改达到更改方法的目的 文件夹目录 首先Student类中有个sleep方法 pro.properties定义了参数 最后是RelectTestMain. package c ...

  8. java反射机制简单实例

    目录 Java反射 简单实例 @(目录) Java反射 Java语言允许通过程序化的方式间接对Class进行操作.Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通 ...

  9. java反射案例

     Java反射经典实例 2007-08-29 17:55:25 分类: Java Java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫——反射.反射机制是如今很多流行框架的实现 ...

随机推荐

  1. 7、Web应用程序中的安全向量 -- 使用Retail部署配置

    该方法不需要胡乱地编辑各个配置设置,而是利用了ASP.NET特性:Retail部署配置. 部署配置是服务器的machine.config文件(在%windir%\Microsoft.NET\Frame ...

  2. 转Rollback后undo到底做了些什么?

    转自:http://biancheng.dnbcw.info/oracle/309191.html Rollback后undo到底做了些什么? 从概念上讲,undo正好与redo相对.当你对数据执行修 ...

  3. ESFramework 通信框架安全机制的设计与实现

    在分布式通信系统中,安全无疑是非常重要的.ESFramework通信框架提供了哪些安全保障了?由于ESFramework通信框架是应用层的开发框架,那么本文我们只讨论ESFramework通信框架在应 ...

  4. C# 语言规范_版本5.0 (第4章 类型)

    1. 类型 C# 语言的类型划分为两大类:值类型 (Value type) 和引用类型 (reference type).值类型和引用类型都可以为泛型类型 (generic type),泛型类型采用一 ...

  5. .Net Core 常见问题整理

    1.安装时报0x80070490 找不到元素 这里应该是vs只装了web没有装c++ 下载一个 VC_redist.x64.exe 安装就行了 https://github.com/dotnet/co ...

  6. LeetCode OJ 42. Trapping Rain Water

    Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...

  7. erlang程序优化点的总结(持续更新)

    转自:http://wqtn22.iteye.com/blog/1820587 转载请注明出处 注意,这里只是给出一个总结,具体性能需要根据实际环境和需要来确定 霸爷指出,新的erlang虚拟机有很多 ...

  8. Time complexity of ArrayList in Java

    The size, isEmpty, get, set, iterator, and listIterator operations run in constant time. The add ope ...

  9. 网络传输中的三张表,MAC地址表、ARP缓存表以及路由表

    一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据帧的.在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据 ...

  10. POJ 2239 Selecting Courses

    二分图的最大匹配.课程和时间可以看做二分图. #include<cstdio> #include<cstring> #include<cmath> #include ...