JAVA反射机制(待完善)

1.什么是反射?

Java的反射(reflection)机制是指在程序的运行状态中,

(1) 可以构造任意一个类的对象
(2) 可以了解任意一个对象所属的类
(3) 可以了解任意一个类的成员变量和方法
(4) 可以调用任意一个对象的属性和方法
这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。
反射机制相关的类在 java.lang.reflect.*; 这个包下

2.反射机制常用的类

Java.lang.Class;
Java.lang.reflect.Constructor;
Java.lang.reflect.Field;
Java.lang.reflect.Method;
Java.lang.reflect.Modifier;

3.获取Class

获取方式
	第一种:	 
		Class c = Class.forName("完整类名");
	第二种:
		Class c = 对象.getClass();
	第三种:
		Class c = int.class;
		Class c = String.class;
获取后实例化对象

获取了Class之后,可以调用无参数构造方法来实例化对象
//c代表的就是日期Date类型

		Class c = Class.forName("java.util.Date");
		//实例化一个Date日期类型的对象
		Object obj = c.newInstance();

newInstance()底层调用的是该类型的无参数构造方法。
如果没有这个无参数构造方法会出现"实例化"异常。

让一个类的“静态代码块”执行

Class.forName(“该类的类名”);
这样类就加载,类加载的时候,静态代码块执行,并且只执行依次
在这里,对该方法的返回值不感兴趣,主要是为了使用“类加载”这个动作。

4.关于路径问题

String path = Thread.currentThread().getContextClassLoader()
.getResource("写相对路径,但是这个相对路径从src出发开始找").getPath();	

String path = Thread.currentThread().getContextClassLoader()
.getResource("abc").getPath();	//必须保证src下有abc文件。

String path = Thread.currentThread().getContextClassLoader()
.getResource("a/db").getPath();	//必须保证src下有a目录,a目录下有db文件。
		
String path = Thread.currentThread().getContextClassLoader()
.getResource("com/bjpowernode/test.properties").getPath();	
//必须保证src下有com目录,com目录下有bjpowernode目录。
//bjpowernode目录下有test.properties文件。

这种方式是为了获取一个文件的绝对路径。(通用方式,不会受到环境移植的影响。)
但是该文件要求放在类路径下,换句话说:也就是放到src下面。
src下是类的根路径。
直接以流的形式返回:

InputStream in = Thread.currentThread().getContextClassLoader()			
.getResourceAsStream("com/bjpowernode/test.properties");

通过反射机制怎么调用一个对象的方法?

反射机制,让代码很具有通用性,可变化的内容都是写到配置文件当中,将来修改配置文件之后,创建的对象不一样了,调用的方法也不同了,但是java代码不需要做任何改动。

 public class ReflectTest10 {
    public static void main(String[] args) throws Exception{
        // 不使用反射机制,怎么调用方法
        // 创建对象
        UserService userService = new UserService();
        // 调用方法
        /*
        要素分析:
            要素1:对象userService
            要素2:login方法名
            要素3:实参列表
            要素4:返回值
         */
        boolean loginSuccess = userService.login("admin","123");
        //System.out.println(loginSuccess);
        System.out.println(loginSuccess ? "登录成功" : "登录失败");

        // 使用反射机制来调用一个对象的方法该怎么做?
        Class userServiceClass = Class.forName("com.bjpowernode.java.service.UserService");
        // 创建对象
        Object obj = userServiceClass.newInstance();
        // 获取Method
        Method loginMethod = userServiceClass.getDeclaredMethod("login", String.class, String.class);
        //Method loginMethod = userServiceClass.getDeclaredMethod("login", int.class);
        Object retValue = loginMethod.invoke(obj, "admin","123123");
        System.out.println(retValue);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值