一、获取构造函数
Class class=Class.forName("con.xiong.Student")
Class.forName()
Student.getClass()
Student.class()
getConstructors()
getDeclaredConstructors()
getDeclaredMethods(
Field[] field = studentClass.getDeclaredFields();
二、获取类
Student student=new Student();
Class studentClass2 = student.getClass();
Class<Student> studentClass1 = Student.class;
Class studentClass = Class.forName("com.xiong.Student");
System.out.println(studentClass1==studentClass);
System.out.println(studentClass1==studentClass2);
System.out.println("是否为Student的实例:"+studentClass.isInstance(Student.class));
try {
Student s1 = (Student) studentClass.newInstance();
s1.setName("ange");
s1.setId(1);
System.out.println(s1.show());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
try {
Constructor constructor1 = studentClass.getConstructor();
Student student1 =(Student) constructor1.newInstance();
student1.setId(1);
student1.setName("ange");
System.out.println(student1.show()+"------->");
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
三、获取字段
public static void main(String[] args) {
try {
Class clazz = Class.forName("com.xiong.Student");
System.out.println("------------获取所有的公共字段------------");
Field[] fields = clazz.getFields();
for (Field field : Arrays.asList(fields)) {
System.out.println(field.getName());
}
System.out.println("------------获取所有的字段------------");
Field[] declaredFields = clazz.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField.getName());
}
System.out.println("------------获取指定的字段------------");
Field age = clazz.getField("age");
System.out.println(age.getName());
Field name=clazz.getDeclaredField("name");
System.out.println(name.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
四、获取方法
public static void main(String[] args) {
try {
Class clazz = Class.forName("com.xiong.Student");
System.out.println("-------获取所有公共方法(包含了父类的方法也包含Object类)------------");
Method[] methods = clazz.getMethods();
List<Method> methods1 = Arrays.asList(methods);
for (Method method : methods1) {
System.out.println(method.getName());
}
System.out.println("-------获取所有的成员方法,包含私有的不包含继承的(不包含继承的)------------");
Method[] declaredMethods = clazz.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
System.out.println(declaredMethod.getName());
}
System.out.println("-------获取单个的------------");
Method show = clazz.getMethod("show", null);
System.out.println(show.getName());
Method text = clazz.getDeclaredMethod("show", null);
System.out.println(text.getName());
Object invoke = text.invoke(Student.class.newInstance(), null);
System.out.println(invoke);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
五、总结
1.如何通过反射获取一个类
1. 类.class()
2.对象.getClass()
3. Class.forName()
2.通过类获取对象
1.Student s=new Student()
2.Class.newInstance()
通过构造方法
3.clazz.getDeclaredConstructor().newInstance()
3.如何获取构造函数
Class clazz = Class.forName("com.xiong.Student");
Constructor[] constructors1 = clazz.getConstructors();
Constructor constructor1 = clazz.getDeclaredConstructor(Integer.class);
System.out.println(constructor1.getName()+"------");
4.如何获取字段
Class clazz = Class.forName("com.xiong.Student");
System.out.println("------------获取所有的公共字段------------");
Field[] fields = clazz.getFields();
for (Field field : Arrays.asList(fields)) {
System.out.println(field.getName());
}
System.out.println("------------获取所有的字段------------");
Field[] declaredFields = clazz.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField.getName());
}
System.out.println("------------获取指定的字段------------");
Field age = clazz.getField("age");
System.out.println(age.getName());
Field name=clazz.getDeclaredField("name");
System.out.println(name.getName());
5.如何获取方法(如何调用方法)
Class clazz = Class.forName("com.xiong.Student");
System.out.println("-------获取所有公共方法(包含了父类的方法也包含Object类)------------");
Method[] methods = clazz.getMethods();
List<Method> methods1 = Arrays.asList(methods);
for (Method method : methods1) {
System.out.println(method.getName());
}
System.out.println("-------获取所有的成员方法,包含私有的不包含继承的(不包含继承的)------------");
Method[] declaredMethods = clazz.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
System.out.println(declaredMethod.getName());
}
System.out.println("-------获取单个的------------");
Method show = clazz.getMethod("show", null);
System.out.println(show.getName());
Method text = clazz.getDeclaredMethod("show", null);
System.out.println(text.getName());
Object invoke = text.invoke(Student.class.newInstance(), null);
System.out.println(invoke);