Java反射

一、 作用

操作字节码文件(class文件)
探索类/接口的信息,属性 构造器 方法
Class:把一个类class的信息包含在一个Class中

二、 包

java,lang.reflect

在这里插入图片描述

三、 获取Class(类名)三种方式

1.	static class<> fornName(String className)
//字符串内容是完整的类名,必须带有包名(“java.lang.Integer”)
//class.forName()的执行会导致类加载
//只想让类中的静态代码块执行:
2.	java中任何一个对象都有getClass方法
String c1=”abc”;
c1.getClass=Class.forName(java.lang.String)
//内存地址一致,都表示String的类,在方法区中
Class c=new().getClass();
3.	java语言中任何一种类型都有.class属性
int.class
class c=int.class

四、 获取class后调用无参构造方法来实例化对象

Object obj=c.newInstance():
调用的是该类的无参构造器

五、 获取类路径文件下的绝对路径

1.	src是类的根路径
2.	String path=
Tread.currentTread().getContextClassLoader().getResource(“类加载器的根路径).getPath();
Tread.currentTread().当前线程对象
getContextClassLoader().获取当前线程的类加载器对象
getResource( ).在当前线程的类加载器默认的根路径下加载资源
类加载器classloader:专门复制加载类的命令
3.	以流的形式返回
Inputstream in=Thread.currentThread().
getContextClassLoader().getResourceAsStream(“com/…”)

六、 资源绑定器

1.	java.util包下提供了一个资源绑定器,便于获取属性配置文件中的内容,使用这种方式属性配置文件xxx.properties必须放到类路径下
ResourceBundle bundle=ResourceBundle.getBundle(“classinfo2”)
String className =bundle.getString(“className”);
System.out.println(className);
文件拓展名必须是xxx.properties

七、 反射属性filed

1. Class c=Class.forName(“///”);

//获得完整类名:c.getName()
//获得简易类名:c.getSimpleName()

2. Field[] fields=c.getFields();

//获取类中所有public属性

3. 有几个元素:fields.length

该元素:Field f=fields[0]
获得名字:f.getName();

4. 获取所有属性

Field[] fields=c.getDeclaredFields();

5. 获取类型:

Class fieldType=f.getType();
field.getName();

6. 获取属性修饰符:

 int i=f.getModifiers();
 //返回int,每一个数字是修饰符的代号
 //转换成字符串:静态方法:String s=Modifier.toString(i);

八、 通过反编译访问对象的属性

1.	获取class: Class c=Class.forName(“路径”);
2.	获得对象: Object obj =c.newInstance();
3.	获取名为no属性: Field noField=c.getDeclaredField(“no”);
4.	给no赋值:
noField.set(obj,2222);
5.	获取no的值
noField.get();
6.	如果是私有属性的需要打破封装:
noField.setAccessble(true);
设置完之后外部也可以访问私有方法

九、 反射机制Mrthod*

1. 可变长参数:(类型…名字)

个数 到n个
在形参中只能出现一个而且必须是最后一个
可以将可变长度当成数组来看,有length属性

2. 获取所有的方法:

Method[] methods=c.getDeclaredMethods();

3. 获取返回值类型的名字

methods.getRerurnType().getSimpleName();

4. 获取修饰符列表:

Modifier.toString(methods.getModifiers());

5. 获取参数列表

Class [] paeameterTypes=methods.getParameterTypes();
//获得参数列表的名字paeameterTypes.getName();
默认agr0 arg1….

十、 通过反射机制调用方法

1.	class Object 
2.	获取Method
Method m=c.getDeclaredMethod
(“name”,类型.class,…)
3.	调用方法**
Object ret=m.invoke(obj,”a”,”b”)
//调用obj对象的m方法,输入 a b 参数,返回ret值

十一、 反射constructor

Constructor [] con=c.getDeclaredConstructors();

十二、 通过反射机制创建对象

1.	调用无参构造:
Class   Object obj=c.newInstance();
2.	获取有参构造
constructor con=
c.getDeclaredConstructor
(参数:int.class,String.class…)
3.	调用有参构造:
Object obj=con.newInstance(参数,…);

十三、 反射接口,父类

1.	class c
2.	Class super=c.getSuperclass();
3.	获取所有接口:
Class [] inter=c.getInterfaces();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值