java中的反射怎么用

Python019

java中的反射怎么用,第1张

首先应该说 反射机制提供的功能是很强大的 但是客观性和维护性很差

一般反射用在 构造框架 以及工具开发等等

但是实际开发软件运用的并不多

下面是一个简单的例子

package com.wqx.test4

public class Test {

public void sayhello(String name)

{

System.out.println("hello:"+name)

}

public static void main(String[] args) {

try {

//把test 这个类载入内存

Class c=Class.forName("com.wqx.test4.Test")

//创建这个类的实例

Object obj=c.newInstance()

//通过class来取得这个方法对象 并且声明 这个类的参数类型

java.lang.reflect.Method method=c.getMethod("sayhello", Class.forName("java.lang.String"))

//invoke 来执行方法对象 记得参数类型要跟这里的参数匹配

method.invoke(obj, "wqx")

} catch (Exception e) {

// TODO: handle exception

}

}

}

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,并且我们还另外创建了几个用于测试的方法,注意下面几个方法的权限都是不同的。

1、反射简言之就是在编译时无法拿到某一个类,但是可以在运行时动态获取这个类,这样去使用某一个类,就是反射的使用场景。

2、代替反射或者类似的操作,可以通过DI实现IOC .依赖注入,动态代理。