一、反射的基础---Class
Class是所有java类的一个总称,就好像各式各样的人都可以用Person来称呼,每一个类被加载之后都会在内存中生存一个Class对象,这个对象我们通常称之为字节码,而我们通过调用一个类创造的对象其实都是字节码搞出来的,一个类只会产生一份字节码。
那么我们怎么获得一个类的Class呢?有三种方式:
1.调用某个类的class属性
2.使用Class的forName()静态方法
3.调用某个对象的getClass()方法。
下面我们通过一个实例来展示下上面两点:
ClassDemo1.java
package com.lyl.exercise;
public class ClassDemo1 {
public static void main(String[] args) throws ClassNotFoundException{
String str="iteye";
Class cl1=String.class;
Class cl2=str.getClass();
Class cl3=Class.forName("java.lang.String");
System.out.println("str对象与String是同一份字节码吗?"+(cl1==cl2));
System.out.println("通过Class.forName()获得的字节码与String.class一样吗?"+(cl1==cl3));
}
}
通过查看JDK文档,我们可以发现,Class有许多方法,通过这些方法我们可以得到java类的相关信息,Constructor,Method,Field等,具体的大家可以参考JDK文档。
二、反射的应用
那么什么是反射呢?曾经有人说过,反射就是把java类中的各种成分映射成相应的java类。为什么呢?从上一个讲解中大家是否发现,通过Class我们可以解析出一个java类的各种成分,他们返回的也是一个类,所以这句话还是很有道理的。
下面让我们来看看反射的一些应用:
1.使用反射生成对象
通过反射来生成对象有两种方式:
a.使用Class对象的newInstance()方法
b.使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建Class对 应类的实例。
实例: ClassDemo3.java
package com.lyl.exercise;
import java.lang.reflect.Constructor;
public class ClassDemo3 {
public static void main(String[] args) throws Exception{
//使用Class对象的newInstance()方法
String str=(String)Class.forName("java.lang.String").newInstance();
//使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建Class对应类的实例。
Constructor constructor=String.class.getConstructor(StringBuffer.class);
String str2=(String)constructor.newInstance(new StringBuffer("abc"));
}
}
2.成员变量的反射
直接上实例大家看看:
ReflectDemo1.java
package com.lyl.exercise;
import java.lang.reflect.Field;
public class ReflectDemo1 {
public static void main(String[] args) throws Exception {
ReflectHelper rh=new ReflectHelper("iteye", "javaeye");
Field fieldb=rh.getClass().getField("b");
//fieldb只是类的字段,不是对象的,所以要想获得对象上的值,要使用get()方法
System.out.println(fieldb.get(rh));
//如果我们使用上面方法来访问a的值呢?抛出java.lang.NoSuchFieldException
/*Field fielda=rh.getClass().getField("a");
System.out.println(fieldb.get(rh));
因为a是私有成员变量
*/
//我们可以通过暴力反射来获取它的值
Field fielda=rh.getClass().getDeclaredField("a");
//设置为可以访问
fielda.setAccessible(true);
System.out.println(fielda.get(rh));
}
}
ReflectHelper.java
package com.lyl.exercise;
public class ReflectHelper {
private String a;
public String b;
public ReflectHelper(String a,String b){
this.a=a;
this.b=b;
}
}
如果将上面的搞懂,那么我们不妨来做一道经典的题目:将一个类中所有String类型的成员变量,其中含有的‘a’替换为‘b’。
这个题目很明显通过反射可以轻易的完成,大家不妨来看看。
package com.lyl.exercise;
import java.lang.reflect.Field;
public class ReflectDemo2 {
public static void main(String[] args) throws Exception {
ReflectHelper rh=new ReflectHelper("abc", "basketball");
changeStringValue(rh);
System.out.println(rh);
}
private static void changeStringValue(Object object) throws Exception{
Field[] fields=object.getClass().getFields();
for(Field field:fields){
if(field.getType()==String.class){
String oldValue=(String)field.get(object);
String newValue=oldValue.replace('a','b');
//将object的String类型的变量替换为newValue
field.set(object, newValue);
}
}
}
}
这样就搞定了,是不是很简单?
未完,待续。。。。。。
分享到:
相关推荐
详细讲解了java反射技术,简单易懂,可以很轻松的学习java的反射机制
在向学生讲解Class.forName()方法的使用时,有时需要扩展讲解为什么这样书写的原理,于是,扩展讲解Java反射技术可以查看被监视类的方法(构造方法和普通方法)、公有属性的功能,以达到封闭功能的效果。该例子使用...
java反射技术应用的很广泛,多看源码,对理解java反射的理解会有很好的认识,这个源码有我自己的理解在里边
反射本身是JAVA 语言的特性,使JAVA 语言有一种在运行时态自“自观”的能力。而 其他面向对象的语言却没有类似的功能。
使用 Java 反射封装 JavaBean <br> 说明:这个程序在没有使用Hiberante时挺有用的 需要一个数据库查询语句 对应的JavaBean的全名(现在是Class,原来Class.getName()) 返回List包含多个JavaBean
对初学者而言这是一个不错的对jdbc学习的资源。
解析Java反射技术讲解如何将字符串变成java中的对象
Java反射机制的使用和学习方法,从底层阐述Java反射机制的原理,让我们更加了解Java反射
Java反射技术的核心在于java.lang.reflect包,它提供了一系列类和接口,用于在运行时获取关于类和对象的信息,并进行相应的操作。主要的类和接口包括Class、Method、Field、Constructor等。 以下是Java反射技术的...
java反射经典实例 看完之后,基本满足你要做的事情,其中包括修改各种私有属性,调用私有方法的例子代码。简单干练。
运行程序,指定一个要分析的类名称,如java.lang.Double,输出类中声明的属性、方法、构造函数等。
java学校必备技术,反射是java的核心,精通反射,做程序开发易如反掌
Java反射机制Java反射机制Java反射机制Java反射机制
java反射机制.doc
利用Java反射、IO、图形化技术相结合实现的一个类搜索小工具,可以直观的看到效果,代码不多,注释齐全,适合初阶段学习。
Java反射机制主要提供了以下功能: l 在运行时判断任意一个对象所属的类; l 在运行时构造任意一个类的对象; l 在运行时判断任意一个类所具有的成员变量和方法; l 在运行时调用任意一个对象的方法; l 生成...
java 反射技术
Java反射技术浅谈
Java反射源码 反射技术
Java反射学习.pdf