Java反射机制是一个非常强大的功能,在很多大型项目比如Spring,Mybatis都可以看见反射的身影。通过反射机制我们可以在运行期间获取对象的类型信息,利用这一特性我们可以实现工厂模式和代理模式等设计模式,同时也可以解决Java泛型擦除等令人苦恼的问题。下面java课程http://www.kmbdqn.com/就从实际应用的角度出发,来应用一下Java的反射机制。
反射基础
p.s:本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的QuickStart。
在应用反射机制之前,首先我们先来看一下如何获取一个对象对应的反射类Class,在Java中我们有三种方法可以获取一个对象的反射类。
通过getClass方法
在Java中,每一个Object都有一个getClass方法,通过getClass方法我们可以获取到这个对象对应的反射类:
Strings="ziwenxie"
Class<?>c=s.getClass()
通过forName方法
我们也可以调用Class类的静态方法forName:
Class<?>c=Class.forName("java.lang.String")
使用.class
或者我们也可以直接使用.class:
Class<?>c=String.class
获取类型信息
在文章开头我们就提到反射的一大好处就是可以允许我们在运行期间获取对象的类型信息,下面我们通过一个例子来具体看一下。
首先我们在typeinfo.interfacea包下面新建一个接口A:
packagetypeinfo.interfacea
publicinterfaceA{voidf()}
接着我们在typeinfo.packageaccess包下面新建一个接口C,接口C继承自接口A,并且我们还另外创建了几个用于测试的方法,注意下面几个方法的权限都是不同的。
《Java教学视频》百度网盘资源免费下载
链接:https://pan.baidu.com/s/1ZvYxfgoyoQCaTFZJIdeP8A
提取码:yzqmJava教学视频|宣传|周末大数据项目部分视频|育知同创《Java大数据-Spring系列精讲之IOC》-卢冲|育知同创-宣传片|育知同创-《VR基础语言-C#入门视频教程》|育知同创-《Mars亲授HTML5开发视频教程》-Mars|育知同创-《Java开发语言视频教程》-Mars|育知同创-《JavaSE基础语言入门视频教程》-饼干|育知同创-Mars直播公开课|育知同创-IOS|育知同创-HTML5|育知同创-Android|VR-史慧哲|Java教学视频
Java 的反射机制是使其具有动态特性的非常关键的一种机制,也是在JavaBean 中广泛应用的一种特性。运用JavaBean 的最常见的问题是:根据指定的类名,类字段名和所对应的数据,得到该类的实例,下面的一个例子演示了这一实现。
-|Base.java //抽象基类
|Son1.java //基类扩展1
|Son2.java //基类扩展2
|Util.java
/**
* @author metaphy
* create 2005-4-14 9:06:56
* 说明:
*/
(1)Base.java 抽象基类只是一个定义
public abstract class Base {
}
(2)Son1.java /Son2.java 是已经实现的JavaBean
public class Son1 extends Base{
private int id
private String name
public int getId() {
return id
}
public void setId(int id) {
this.id = id
}
public String getName() {
return name
}
public void setName(String name) {
this.name = name
}
public void son1Method(String s){
System.out.println(s)
}
}
(3)
public class Son2 extends Base{
private int id
private double salary
public int getId() {
return id
}
public void setId(int id) {
this.id = id
}
public double getSalary() {
return salary
}
public void setSalary(double salary) {
this.salary = salary
}
}
(4)Util.java 演示了如何根据指定的类名,类字段名和所对应的数据,得到一个类的实例
import java.lang.reflect.Method
public class Util {
//此方法的最大好处是没有类名Son1,Son2 可以通过参数来指定,程序里面根本不用出现
public static Base convertStr2ServiceBean(String beanName,String fieldSetter,String paraValue){
Base base = null
try {
Class cls = Class.forName(beanName)
base = (Base)cls.newInstance()
Class[] paraTypes = new Class[]{String.class }
Method method = cls.getMethod(fieldSetter, paraTypes)
String[] paraValues = new String[]{paraValue}
method.invoke(base, paraValues)
} catch (Throwable e) {
System.err.println(e)
}
return base
}
public static void main(String[] args){
Son1 son1 =(Son1) Util.convertStr2ServiceBean("trying.reflect.Son1","setName","wang da sha")
System.out.println("son1.getName() :"+son1.getName())
}
}
//调用结果:
//son1.getName() :wang da sha