java 反射的实例

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

}

}

输出结果:

[email protected]

name:=null

[email protected]

name:=royzhou

hobby:football,basketball,

modify name using Field:=royzhou1985

get methods of class SimpleBean:

setHobby

getHobby

getName

toString

setName

set by invoke Method

[email protected]

name:=royzhou1985

hobby:tennis,fishing,

时间: 2024-08-08 09:28:37

java 反射的实例的相关文章

java反射技术实例

java反射技术实例?1. [代码][Java]代码     package com.gufengxiachen.java.reflectiontest; public class Person {private String name;private int age;private static int total;public Person(){super();total++;}public Person(String name,int age){super();this.name=name

Java反射机制实例解析

1.获取想操作的访问类的java.lang.Class类的对象     2.调用Class对象的方法返回访问类的方法和属性信息     3.使用反射API来操作      每个类被加载后,系统会为该类生成一个对应的Class对象,通过该Class对象就可以访问到Java虚拟机中的这个类,Java程序中获取Class对象通常有如下三种方式: 1.调用某个对象的getClass()方法,是Object中的一个方法,所以所有类都可以调用这个方法 Person p= new Person(); Clas

java反射与动态代理

Java反射与动态代理 Java反射机制可以动态地获取类的结构,动态地调用对象的方法,是java语言一个动态化的机制.java动态代理可以在不改变被调用对象源码的前提下,在被调用方法前后增加自己的操作,极大地降低了模块之间的耦合性.这些都是java的基础知识,要想成为一名合格的程序猿,必须掌握! Java反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为

【转载】Java反射机制详解

转自:http://baike.xsoftlab.net/view/209.html#3_8 1反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 2反射机制能做什么 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类: 在运行时构造任意一个类的对象: 在运行时判断任意一个类所具有的成员变量和方法: 在运行时调用任意一个

java反射知识点总结

一.java反射基础 1.1 什么叫java反射? 答:程序运行期间,动态的获取类的基本信息.比如:创建对象,调用类的方法,获得类的基本结构.这样给程序设计提供了很大的灵活性.个人总结就是:根据动态需求,生成动态的响应. 1.2 java反射的好处? 答:java反射给程序设计提供了很大的灵活性,解决了很多死的东西.可以根据动态需求,产生动态响应.常用框架中基本都用到了反射,尤其在hibernate这种持久层框架中,用反射生成sql语句. 1.3 java反射不好的地方 答:缺点是对性能有影响.

java 反射机制的概念

java 反射 定义 功能 示例 概要: Java反射机制详解 | |目录 1反射机制是什么 2反射机制能做什么 3反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实例化Class类对象 ·获取一个对象的父类与实现的接口 ·获取某个类中的全部构造函数 - 详见下例 ·通过反射机制实例化一个类的对象 ·获取某个类的全部属性 ·获取某个类的全部方法 ·通过反射机制调用某个类的方法 ·通过反射机制操作某个类的属性 ·反射机制的动态代理 4反射机制的应用实例 ·在泛型为Integer的Arr

Java反射机制的学习

Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调用其方法或修改其域(甚至是本身声明为private的域或方法). 也许你使用Java已经很长时间了,可是几乎不会用到Java反射机制.你会嗤之以鼻地告诉我,Java反射机制没啥用.或许在J2EE.J2SE等平台,Java反射机制没啥用(具体我也不了解,不多做评论),但是在Android应用开发中,该

Java 反射详解 转载

java 反射 定义 功能 示例 概要: Java反射机制详解 | |目录 1反射机制是什么 2反射机制能做什么 3反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实例化Class类对象 ·获取一个对象的父类与实现的接口 ·获取某个类中的全部构造函数 - 详见下例 ·通过反射机制实例化一个类的对象 ·获取某个类的全部属性 ·获取某个类的全部方法 ·通过反射机制调用某个类的方法 ·通过反射机制操作某个类的属性 ·反射机制的动态代理 4反射机制的应用实例 ·在泛型为Integer的Arr

[转载] Java反射机制的学习

本文转载自: http://www.blogjava.net/zh-weir/archive/2011/03/26/347063.html Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调用其方法或修改其域(甚至是本身声明为private的域或方法). 也许你使用Java已经很长时间了,可是几乎不会用到Java反射机制.你会嗤之以鼻地告诉我,Ja