Java反射、注解、动态代理、XML解析
反射
获取类对象
Class<?> aClass = Class.forName("com.lmx.ReflectionDomo.Student");
Class<Student> studentClass = Student.class;
Student student = new Student();
Class<? extends Student> aClass1 = student.getClass();
获取构造器对象
Constructor<?>[] constructors = studentClass.getConstructors();
Constructor<?>[] declaredConstructors = studentClass.getDeclaredConstructors();
declaredConstructor.setAccessible(true);
Student testsutdent = declaredConstructor.newInstance("1", "2", "3");
成员变量
Field[] field = studentClass.getFields();
Field[] declarefield = studentClass.getDeclaredFields();
Field age = studentClass.getDeclaredField("age");
System.out.println(age.getType());
age.setAccessible(true);
age.set(testsutdent, "23");
方法对象
Method[] methods = studentClass.getMethods();
- 获取到的方法对象可以通过invoke函数进行调用,例如:add.invoke(list, “李满祥”);
- 使用案例,向集合框架中添加不类型的元素
```
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
System.out.println(list);
Class<? extends ArrayList> aClass2 = list.getClass();
Method add = aClass2.getMethod("add", Object.class);
add.invoke(list, "李满祥");
注解
注解的定义
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Bool {
String name();
String autor();
String[] character();
}
- @Traget注解为元注解,指定该注解可以使用的位置,例如,类(type),方法(method),属性(Feild)等
- @Retention注解,指定该注解生效的区域,在运行时与字节码生效
- 核心方法:getDeclaredAnnotation(),返回值为注解对象;
- isAnnotationPresent(),判断是否具有该注解
- 使用案例
package com.lmx.zhujie;
import com.lmx.proxy.proxy_Annation.Mytest;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class MoNiJUnite {
public void test1() {
System.out.println("test1");
}
public void test2() {
System.out.println("test2");
}
public void test3() {
System.out.println("test3");
}
public void test4() {
System.out.println("test4");
}
public static void main(String[] args) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException, InstantiationException {
Class<MoNiJUnite> moNiJUniteClass = MoNiJUnite.class;
Constructor<MoNiJUnite> constructor = moNiJUniteClass.getConstructor();
MoNiJUnite moNiJUnite = constructor.newInstance();
Method[] declaredMethods = moNiJUniteClass.getDeclaredMethods();
for (Method m : declaredMethods) {
if (m.isAnnotationPresent(Mytest.class)) {
m.invoke(moNiJUnite);
}
}
}
}
public static void main(String[] args) throws NoSuchMethodException {
Class<ZhuJie> zhuJieClass = ZhuJie.class;
if (zhuJieClass.isAnnotationPresent(Bool.class)) {
Bool declaredAnnotation = zhuJieClass.getDeclaredAnnotation(Bool.class);
System.out.println(declaredAnnotation.autor());
System.out.println(declaredAnnotation.name());
System.out.println(declaredAnnotation.character());
}
动态代理
- 再不改变原有方法的基础上,增强方法的功能
- 通过Proxy.newProxyInstance()方法获取动态代理对象,传入参数为,预备代理对象的类加载器,预备代理对象的接口,实现一个InvocationHandler匿名内部类
- obj.getClass().getInterfaces()方法可以获取指定对象实现的接口
public static Object getProxy(Object obj) {
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
long l = System.currentTimeMillis();
Arrays.stream(method.getAnnotations()).forEach(x-> System.out.println(x));
Object invoke = method.invoke(obj, args);
long l1 = System.currentTimeMillis();
System.out.println(method.getName() + "方法运行时长是:" + (l1 - l) + "ms" + "\t结果是:" + invoke);
return invoke;
}
});
}
Service service = new Serviceiml();
Service proxy1 = (Service) getProxy(service);
proxy1.updateUser();
xml解析
SAXReader saxReader = new SAXReader();
InputStream resourceAsStream = xml_Dom4j.class.getResourceAsStream("/resoursesss/test.xml");
Document read = saxReader.read(resourceAsStream);
Element rootElement = read.getRootElement();
List<Element> elements = rootElement.elements("student");
ArrayList<Student> students = new ArrayList<>();
for (Element e : elements) {
Student student = new Student();
student.setId(Integer.valueOf(e.attributeValue("id")));
student.setVip(Boolean.valueOf(e.elementTextTrim("vip")));
student.setAge(Integer.valueOf(e.elementText("age")));
student.setAddress(e.elementText("adress"));
student.setName(e.elementText("name"));
students.add(student);
}
System.out.println(students);
- Xpath检索
- xml_Xpath.class.getClassLoader().getResourceAsStream(“resoursesss/test.xml”),该方法获取的是以src为根目录
SAXReader saxReader = new SAXReader();
try {
Document read = saxReader.read(xml_Xpath.class.getClassLoader().getResourceAsStream("resoursesss/test.xml"));
Element rootElement = read.getRootElement();
List<Node> nodes = read.selectNodes("//student[@id='3']/name");
List<Node> nodes1 = read.selectNodes("//@id");
for (Node node :nodes1){
Attribute attribute=(Attribute) node;
System.out.println(attribute.getName() + "=====>" + attribute.getValue());
}
for (Node node: nodes){
Element element=(Element) node;
System.out.println(element.getTextTrim());
}
} catch (DocumentException e) {
e.printStackTrace();
}