反射机制

*1、反射机制有什么用?(关系到后面的框架)*

​ 通过java语言中的反射机制可以操作字节码文件,或者访问字节码文件。

​ 优点类似于黑客(可以读和修改字节码文件)

​ 通过反射机制可以操作代码片段(class文件)

​ 作用:可以让程序更加灵活。

*2、反射机制的相关类在哪个包下?*

​ java . lang . reflect .*

*3、反射机制相关的重要类有哪些?*

(重要)java.lang.Class 代表整个字节码,一个类型。代表整个类。

(重要)java.lang.reflect.Method 代表字节码中的方法字节码。代表类中的方法。

(重要)java.lang.reflect.Filed 代表字节码中的属性字节码。代表类中的方法。

​ java.lang.reflect.Constructor 代表字节码中的构造方法字节码。代表类中的构造方法。

例如:	class Number{		       //Class

​		private int i=0;	       //Filed


​		public Number(int i) {      //Constructor
​			super();
​			this.i = i;
​		}

​		public Number() {
​			super();
​		}

​		public int getI() {		//Method
​			return i;
​		}

​		public void setI(int i) {
​		this.i = i;
​		}
​	}

*4、要操作一个类的字节码,首先要获取这个 类 的字节码,怎么获取? java.lang.Calss*

*三种方式:*

***\*(1)第一种:Calss c1=Class.forName("完整类名带包名");\****

​ Object obj=c1.newInstance(); //newInstance()方法底层调用了类c1的无参数构造方法,所以c1必须有无参构造。

​ forName()为静态方法;

		方法的参数是一个字符串;字符串需要的是一个完整类名;

		完整类名必须带包名,例如:java.lang.String

​ 使用forName()时,传入的类会进行类加载

*(2)第二种:Class c2=对象引用.getClass();*

​ 实例方法;

​ 任何对象都有的方法;

***\*(3)第三种:Class c3=任何类型(包括基本数据类型).Class;\****

​ java中任何一种类型并且包括 基本数据类型,都有的.class属性。

*5、如何获取一个类文件的绝对路径?(死记)*

​ 下面的这种方式是通用,默认在src下查找,前提是该文件必须在类路径(src)下:

*(1)方法一:先获取文件的绝对路径*

String path=Thread.currentThread.getContextClassLoader().getResource("文件相对src下的位置").getPath();

*(2)方法二:先获取文件的流(建议使用,不需要new io流了)*

InputStream inputStream=Thread.currentThread().getContextClassLoader().getResourceAsStream("文件相对src下位置");

 

*(3)方法三:获取资源绑定器(如果读取properties文件,建议使用)*

	ResourceBundle bundle=ResourceBundle.getBundle("properties文件文件名");

​	String s=bundle.getString("key值");

​ 注意:上面的"properties文件名",不能有文件类型后缀。例如,db.properties文件,传进去时写成:“db”。

*6、如果只想让一个类的静态代码块执行:*

​ Class.forName(“类路径”);

​ 因为forName()方法会进行类加载。

*7、可变参数:*

类型…args 例:int…args String…args1 double…args2

注意:(一定是三个点, …)

1.可变长度参数要求的参数个数是:0~N个

2.可变长度参数在方法参数列表中必须在最后一个位置,并且方法参数列表中只有一个

3.可变参数长度可以当做一个数组来看待,也有length属性

*8、通过反射机制访问和修改属性值*

​ 例:

​ (1)获取Class字节码文件

​ Class c1=Class.forName(“类路径”);

​ (2)获取类对象obj

​ Object obj=c1.newInstance();

​ (3)通过属性名获取属性

​ Field no= c1.getDeclaredField(“no”); //getDeclaredFiled(“属性名”)

​ (4)设置属性值

​ 如果是私有属性:

​ no.setAccessible(true); //打破私有封装

​ no.set(obj, 141);

​ 如果不是私有属性:

​ no.set(obj, 141);

​ (5)获取属性值

​ no.get(obj);

*9、通过反射机制调用方法:*

​ 例:

​ (1)获取Class字节码文件

		Class c1=Class.forName(“类路径”);

​ (2)获取类对象ljs

		Object ljs=c1.newInstance();

​ (3)通过反射机制获取文件中的方法:getDeclaredMethod(“方法名”,参数类型.class)

		Method login=c1.getDeclaredMethod("login", int.class,String.class);

​ (4)通过反射机制调用方法:invoke(对象名,参数值)

		Object value=login.invoke(ljs, 141,"ljs");

*10、通过反射机制调用构造方法:*

*调用无参构造*

例: (1)获取Class字节码文件

		Class c1=Class.forName(“类路径”);

​ (2)获取类对象ljs,调用无参构造

		Object ljs=c1.newInstance();

*调用有参构造*

例: (1)获取Class字节码文件

Class c1=Class.forName(“类路径”);

 

​       Constructor c= c1.getDeclareConstructor(int.calss, String.class);

 

Object obj=c.newInstance(141,"ljs");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值