Java------reflection反射
基本概念
- 反射机制指的是可以于在运行时加载、探知、使用编译期间完成未知的类
- 程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;
- 加载完类之后,在堆内存中就产生一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射
package com.briup.reflection.test;
public class User {
private int id;
private String name;
private int age;
public User() {
super();
}
public User(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package com.briup.reflection;
import com.briup.reflection.test.User;
@SuppressWarnings("all")
public class Demo01 {
public static void main(String[] args) {
String path = "com.briup.reflection.test.User";
try {
Class clazz1 = Class.forName(path);
Class clazz2 = Class.forName(path);
User user = new User();
Class clazz3 = user.getClass();
Class clazz4 = String.class;
Class clazz5=int.class;
Class clazz6=int[][].class;
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
package com.briup.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import javax.activation.FileDataSource;
public class Demo02 {
public static void main(String[] args) {
String path = "com.briup.reflection.test.User";
try {
Class clazz = Class.forName(path);
System.out.println(clazz.getName());
System.out.println(clazz.getSimpleName());
Field[] field = clazz.getDeclaredFields();
for (Field fields : field) {
System.out.println("属性:"+fields);
}
Method[] method = clazz.getDeclaredMethods();
Method m = clazz.getDeclaredMethod("setName", String.class);
for (Method methods : method) {
System.out.println("方法:"+methods);
}
Constructor[] constructor = clazz.getDeclaredConstructors();
for (Constructor constructors : constructor) {
System.out.println("构造器:"+constructors);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.briup.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import com.briup.reflection.test.User;
public class Demo03 {
public static void main(String[] args) {
String path = "com.briup.reflection.test.User";
try {
Class<User> clazz = (Class<User>) Class.forName(path);
User u1 = clazz.newInstance();
System.out.println(u1);
Constructor<User> c = clazz.getDeclaredConstructor(int.class,String.class,int.class);
User u2 = c.newInstance(1001,"hwj",23);
System.out.println(u2.getName());
User u3 = clazz.newInstance();
Method m = clazz.getDeclaredMethod("setName", String.class);
m.invoke(u3, "郇文杰");
System.out.println(u3.getName());
User u4 = clazz.newInstance();
Field f = clazz.getDeclaredField("name");
f.setAccessible(true);
f.set(u4, "张梓溪");
System.out.println(u4.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}