文章目录
- 反射
- 获取类的各种信息
- 获取类的字节码文件
- 注解
- 元注解
- 复习redis
- 两道算法题
摆烂了,不想学啦!!!
反射
反射主要用来做框架;
学习内容
获取类的各种信息
第一步 加载类,获取类的字节码文件
第二步 获取类的构造器 (对象);
第三步 获取类的成员遍历 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 {@MyTestpublic void test1(){System.out.println("test1");}public void test2(){System.out.println("test2");}public void test3(){System.out.println("test3");}@MyTestpublic 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 {}
注解就是告诉别人需要干什么