java 反射

类加载器

类加载器负责将.class文件,加载到内存中,并为之生成对应的Java.lang.class对象。一个类在JVM中用其全限定类名和其类加载器作为唯一标识。

Java 为ClassLoader提供了一个URLClassLoader的实现类。该类功能比较强大,它既可以从本地的文件系统获取二进制文件来加载类,也可以从远程主机获取二进制文件来加载类。

创建URLClassLoader时传入了一个URL数组参数,该ClassLoader就可以从这系列URL指定的资源中,加载指定类,这里的URL可以以file:为前缀表明从本地文件系统加载,可以以http:为前缀,表明从互联网通过HTTP访问来加载,也可以ftp:为前缀,表明从互联网通过FTP访问来加载,功能非常强大。

先来运行一段代码,直观感受:

public static void main(String[] args) throws Exception {
	//class对象的三种获取方式
	System.out.println(new UserService().getClass());//1、通过对象getClass方法
	System.out.println(UserService.class);//2、通过类的class属性
	Class<?> clz = Class.forName("com.changhf2.reflect.UserService");//3、通过Class类的静态方法forName()来实现
	System.out.println(clz);
	UserService userService = (UserService) clz.newInstance();//class对象动态生成
	Method method = clz.getMethod("getDetails", new Class[] { String.class, Integer.class, String.class });
	Object returnObj = method.invoke(userService, new Object[]{"I'm ", 11, " years old",});
        // Method method = clz.getMethod("getDetail",  String.class);
        // Object returnObj = method.invoke(userService, "changhf");
	System.out.println(method);
	System.out.println(returnObj);
}

调用Class.newInstance();来创建一个类的实例,这种方式要求类必须要有默认构造器,实际上是利用默认构造器来创建对象的。获取class对象一般采用第二种方式(UserService.class)来获取该类的Class对象,好处是1、安全,编译阶段就可以检查要访问的Class是否存在,2、性能更高,因为无需调用方法。

public class UserService {
   public String getDetails(String str1,Integer age,String str2){
       return str1+age+str2;
   }
} 

运行结果:

class com.changhf2.reflect.UserService
class com.changhf2.reflect.UserService
class com.changhf2.reflect.UserService
public java.lang.String com.changhf2.reflect.UserService.getDetails(java.lang.String,java.lang.Integer,java.lang.String)
I'm 11 years old

从配置文件中读取配置信息,然后通过反射机制拿到类的实例对象

Properties p = new Properties();
p.load(AppTest.class.getClassLoader().getResourceAsStream("config.properties"));
String val = p.getProperty("factory");
Object instance = Class.forName(val).newInstance();
AbstractFactory factory = (AbstractFactory) instance;
factory.run();
factory=com.changhf.AbstractFactory

反射机制概念 

 

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

反射的优点是只要配置就可以生成对象,可以降低程序的耦合度,比较灵活。缺点是运行比较慢。大部分情况下,为了灵活度以及降低耦合度,我们还是会使用反射的,比如SpringIOC容器。

DemoServiceImpl object = (DemoServiceImpl) Class.forName("com.changhf.service.DemoService").newInstance();
Method method = object.getClass().getMethod("getDetail",  String.class);
Object returnObj = method.invoke(object, "changhf");
System.out.println(returnObj);

对象在反射机制下生成后,反射了方法,这样我们完全可以通过配置来完成对象和方法的反射,大大增强了java的可配置性和可扩展性,SpringIOC就是这么做的。

参考:

Java学习之反射机制及应用场景
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值