一、 作用
操作字节码文件(class文件)
探索类/接口的信息,属性 构造器 方法
Class:把一个类class的信息包含在一个Class中
二、 包
java,lang.reflect
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/05c57f4733e3626039be18a99d29c794.png)
三、 获取Class(类名)三种方式
1. static class<> fornName(String className)
2. java中任何一个对象都有getClass方法
String c1=”abc”;
c1.getClass=Class.forName(java.lang.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();