摆烂了,不想学啦!!!
反射
反射主要用来做框架;
学习内容
获取类的各种信息
第一步 加载类,获取类的字节码文件
第二步 获取类的构造器 (对象);
第三步 获取类的成员遍历 Field对象
第四步 获取类的成员方法,Method对象
获取类的字节码文件
1 类名.class 获取反射对象
2 调用Class提供的方法forname
3 通过object类提供的方法 getclass,要先有对象才能调用;
获取反射对象的三种方式
public class Test {
public static void main(String[] args) throws NoSuchFieldException, ClassNotFoundException {
//第一种方式
Class c1=Student.class;
System.out.println(c1.getName());
// System.out.println(c1.getSimpleName());
// System.out.println(c1.getField(c1.getName()));
//第二种方式
Class c2= Class.forName("反射.Student"); //会有异常,classNotFoundException类找不到异常
System.out.println(c2.getName());
//第三种
Student student =new Student();
Class c3= student.getClass();
System.out.println(c3.getName());
}
}
获取类的构造器,并对构造器进行操作
public class Test2 {
public static void main(String[] args) throws NoSuchMethodException {
Class C= Student.class;
Constructor[] constructors = C.getConstructors();//构造器封装成数组
for (Constructor constructor:constructors){
System.out.println(constructor.getName()+ " 参数个数"+constructor.getParameterCount() );
}
Constructor declaredConstructor = C.getDeclaredConstructor();
Constructor constructor=C.getConstructor(int.class,String.class);
System.out.println(constructor.getName()+"参数个数"+constructor.getParameterCount());
}
}
获取类的构造器的作用,初始化对象;
在初始的时候可以指定泛型,后面就可以不用进行强转。
如何构造方法是private修饰的,需要设置setAccessible;
获取类的成员变量
可以直接使用getName()等,这是为后面学习框架使用的。
获取类的成员方法
package 反射;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.lang.reflect.Field;
public class ObjectFrame {
public static void saveObject(Object obj) throws Exception {
PrintStream ps=new PrintStream(new FileOutputStream("src\\data.txt",true));
Class c= obj.getClass(); //得到传进来对象的字节码文件
String cName=c.getSimpleName();
ps.println("*-*******"+cName+"---------------------");
Field[] fidlds = c.getDeclaredFields(); //得到的是字段
for (Field field : fidlds) {
field.setAccessible(true);//设置暴力访问
String name = field.getName();//得到对应字段的名称
String value=field.get(obj)+"";//得到对应字段的值,转为字符串
ps.println(name+"="+value);
}
ps.close();
}
}
通过反射读取信息。
注解
自定义注解
元注解
修饰注解的注解
常见的元注解
目标注解,
声明注解的周期
注解的解析
判断类上面、方法上面、成员变量上面是否存在注解,并把注解的内容解析出来
注解开发的应用场景
配合反射的技术做框架的;
模拟简易版的junit框架
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test2 {
@MyTest
public void test1(){
System.out.println("test1");
}
public void test2(){
System.out.println("test2");
}
public void test3(){
System.out.println("test3");
}
@MyTest
public void test4(){
System.out.println("test4");
}
public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
Test2 test2=new Test2();
//实现启动程序
Class c= Test2.class;
Method[] declaredMethods = c.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
if (declaredMethod.isAnnotationPresent(MyTest.class)){
declaredMethod.invoke(test2);
}
}
}
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {
}
注解就是告诉别人需要干什么