菜鸡学Java反射

反射

反射是框架设计的灵魂,将类的各个组成部分封装为其他对象即是反射
反射的好处是:
1.可以在程序运行过程中操作类的组成部分对象
2.可以解耦,提高程序可扩展性

获取Class对象的三种方法

1.Class.forName(String name)           通过全类名获取Class对象 ,多用于配置文件中获取,
2.类名.class						   通过类本身继承自Object类中的class属性来获取Class对象,多用于参数传递
3.对象.getClass()					   通过定义于Object类的getClass()方法来获取,多用于获取字节码的方式

Class对象的功能:

一、获取成员变量

方法有:
Field[] getFields()   						获取所有public修饰的成员变量
Field   getField(String name)   			获取指定的名称的public修饰的成员变量
Field[] getDeclaredFields()    				获取所有的成员变量,不被修饰符所限制
Field   getDeclaredField(String name)		获取指定的成员变量,在设置安全检查后可以读取此变量不管是否被private修饰
Field.Accessible(true)						暴力反射方法,即设置安全检查
Field.set(obj,value)						将obj对象的该属性值设置为value

二、获取构造器方法

方法有:
ConStructor<?>[] getConstructors()        	
ConStructor<T>   getConstructor(类<?>...ParameterTypes)
ConStructor<T>	 getDeclaredConstructor(类<?>...ParameterTypes)
ConStructor<?>[] getDeclaredConstructors()
ConStructor.newInstance(value...parameterType)    使用Constructor创建对象
T.newInstance()									  使用类继承自Object类中的静态方法直接构造类对象

三、获取成员方法

方法有:
Method[]  getMethods()
Method    getMethod(String name,类<?>...parameterTypes)
Method[]  getDeclaredMethods()
Method	  getDeclaredMethod(String name,类<?>...parameterTypes)
Method.setAccessible(true)
Object    invoke(obj,object...args)		执行方法

使用这些方法做“框架”:创建任意类的实例,并调用方法


import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

public class frameSelf {
    public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        //创建属性集
        Properties pro = new Properties();  
        //获取当前假框架类的类加载器  
        ClassLoader classLoader = frameSelf.class.getClassLoader();    
        //获取类加载器的资源获取的字节流  
        InputStream resourceAsStream = classLoader.getResourceAsStream("pro.properties");
        pro.load(resourceAsStream);  //让属性集加载流中的数据               
        // 获取className
        String className = pro.getProperty("className");  
        //获取methodName 
        String methodName = pro.getProperty("methodName");  
         //将className加载到内存中
        Class cls = Class.forName(className);     
         //创建对象 
        Object obj = cls.newInstance();
        //获取方法             
        Method method = cls.getMethod(methodName);  
         //执行方法
         method.invoke(obj); 
    }           
}

以上就是本菜鸟所学习到的反射的基础内容,如有错误还请各位大佬多多指教

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值