反射
* 反射 : 通过另一种动态手段做之前的事情, 比如创建对象, 访问属性, 调用方法
@Test
public void test2() {
try {
Class clazz = Class.forName("com.atguigu.javase.reflect.Teacher");
Object object = clazz.newInstance();
System.out.println(object);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
通过反射给对象的属性赋值
@Test
public void test3() {
try {
Class clazz = Class.forName("com.atguigu.javase.reflect.Teacher");
Object object = clazz.newInstance();
System.out.println(object);
Field nameField = clazz.getField("name");
nameField.set(object, "红康");
System.out.println(nameField.get(object));
Field ageField = clazz.getField("age2");;
ageField.set(object, 30);
System.out.println(ageField.get(object));
Field genderField = clazz.getField("gender");
genderField.set(object, "男");
System.out.println(object);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
突破封装. 暴力反射
Field nameField = clazz.getDeclaredField("name");
nameField.setAccessible(true);
@Test
public void test4() {
try {
Class clazz = Class.forName("com.atguigu.javase.reflect.Teacher");
Object object = clazz.newInstance();
Field nameField = clazz.getDeclaredField("name");
nameField.setAccessible(true);
System.out.println(nameField);
nameField.set(object, "红康");
System.out.println(nameField.get(object));
Field ageField = clazz.getDeclaredField("age");
ageField.setAccessible(true);
ageField.set(object, 30);
Field genderField = clazz.getDeclaredField("gender");
genderField.setAccessible(true);
genderField.set(object, "男");
System.out.println(object);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
类模板和接口列表
@Test
public void test5() throws Exception {
Class clazz = Class.forName("com.atguigu.javase.reflect.Teacher");
String name = clazz.getName();
System.out.println(name);
Class superclass = clazz.getSuperclass();
System.out.println(superclass);
Class[] interfaces = clazz.getInterfaces();
for (int i = 0; i < interfaces.length; i++) {
System.out.println(interfaces[i]);
}
}
int.class和Integer.class
@Test
public void test7() throws IllegalAccessException, InstantiationException {
Class clazz1 = Integer.class;
Class clazz2 = int.class;
System.out.println(clazz1 == clazz2);
boolean b = clazz2.isPrimitive();
System.out.println(b);
System.out.println(boolean.class);
}
获取类模板对象的四种方法
@Test
public void test6() throws ClassNotFoundException {
Class clazz1 = Teacher.class;
Class clazz2 = new Teacher("a", 2, "b").getClass();
System.out.println(clazz1 == clazz2);
Class clazz3 = Class.forName("com.atguigu.javase.reflect.Teacher");
System.out.println(clazz1 == clazz3);
Class clazz4 = this.getClass().getClassLoader().loadClass("com.atguigu.javase.reflect.Teacher");
System.out.println(clazz3 == clazz4);
}
类加载器3个层次(了解)
@Test
public void test8() throws IOException {
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
System.out.println(systemClassLoader);
ClassLoader extentionClassLoader = systemClassLoader.getParent();
System.out.println(extentionClassLoader);
ClassLoader bootstrapClassLoader = extentionClassLoader.getParent();
System.out.println(bootstrapClassLoader);
InputStream in = this.getClass().getClassLoader().getResourceAsStream("test.properties");
Properties properties = new Properties();
properties.load(in);
Iterator<Map.Entry<Object, Object>> iterator = properties.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<Object, Object> next = iterator.next();
System.out.println(next);
}
}
通过反射获取构造器对象
@Test
public void test9() {
try {
Class clazz = Class.forName("com.atguigu.javase.reflect.Teacher");
Constructor constructor = clazz.getConstructor(String.class, int.class, String.class);
Object object = constructor.newInstance("芳芳", 20, "女");
System.out.println(object);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
通过反射获取方法
@Test
public void test10() {
try {
Class clazz = Class.forName("com.atguigu.javase.reflect.Teacher");
Object object = clazz.newInstance();
Method size = clazz.getMethod("size");
Object invoke = size.invoke(object);
System.out.println("size : " + invoke);
Method lessonMethod = clazz.getDeclaredMethod("lesson", String.class, int.class);
lessonMethod.setAccessible(true);
Object retValue = lessonMethod.invoke(object, "JavaSE", 202);
System.out.println("返回值:" + retValue);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
获取静态属性
@Test
public void test11() {
Class clazz = null;
try {
clazz = Class.forName("com.atguigu.javase.reflect.Teacher");
Field school = clazz.getField("school");
Object o = school.get(null);
System.out.println(o);
Method test = clazz.getMethod("test");
test.invoke(null);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
通过反射获取注解中的属性值
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
int id() default 100;
String value() default "abc";
}
@Test
public void test12() throws ClassNotFoundException, NoSuchMethodException {
Class clazz = Class.forName("com.atguigu.javase.reflect.Teacher");
Annotation annotation = clazz.getAnnotation(MyAnnotation.class);
System.out.println(annotation);
Method lesson = clazz.getDeclaredMethod("lesson", String.class, int.class);
MyAnnotation annotation1 = lesson.getAnnotation(MyAnnotation.class);
System.out.println(annotation1);
}