package com.fh.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 获得类的运行时结构
*/
public class RunTimeClassTest {
public static void main(String[] args) throws Exception {
/**
* 访问无参构造函数
*/
Class<?> aClass = Class.forName("com.fh.reflection.Stu");
Stu stu = (Stu) aClass.newInstance();
System.out.println(stu);
/**
* 访问有参私有构造函数
*/
aClass = Class.forName("com.fh.reflection.Stu");
Constructor<?> declaredConstructor1 = aClass.getDeclaredConstructor(Integer.class, String.class);
declaredConstructor1.setAccessible(true);
stu = (Stu) declaredConstructor1.newInstance(12,"王子啊");
System.out.println(stu);
/**
* 通过反射调用调用方法
*/
aClass = Class.forName("com.fh.reflection.Stu");
Method setName = aClass.getDeclaredMethod("setName", String.class);
//给stu对象绑定setName方法;给stu对象setName(name)参数name赋值
setName.invoke(stu,"反射name赋值");
Method getName = aClass.getDeclaredMethod("getName");
//给stu对象绑定getName方法
String getName_ = (String) getName.invoke(stu);
System.out.println("【获得通过反射调用方法的返回值】"+getName_);
/**
* 通过反射调用属性
*/
aClass = Class.forName("com.fh.reflection.Stu");
stu = (Stu) aClass.newInstance();
Field name = aClass.getDeclaredField("name");
name.setAccessible(true);
//给stu对象绑定name属性
name.set(stu,"通过反射属性赋值");
System.out.println(stu.getName());
}
public static void getClass_() throws NoSuchMethodException {
Class<Stu> stuClass = Stu.class;
System.out.println("【获得类名】"+stuClass.getName()+"-------"+stuClass.getSimpleName());
Field[] declaredFields = stuClass.getDeclaredFields();
System.out.println("【获取类的所有属性】");
for (int i = 0; i < declaredFields.length; i++) {
System.out.println(declaredFields[i]);
}
Field[] fields = stuClass.getFields();
System.out.println("【获取类的public属性】");
for (int i = 0; i < fields.length; i++) {
System.out.println(fields[i]);
}
Method[] declaredMethods = stuClass.getDeclaredMethods();
System.out.println("【获取类的所有方法】");
for (int i = 0; i < declaredMethods.length; i++) {
System.out.println(declaredMethods[i]);
}
Method[] methods = stuClass.getMethods();
System.out.println("【获取类的public方法-父子类所有public方法】");
for (int i = 0; i < methods.length; i++) {
System.out.println(methods[i]);
}
Method getName = stuClass.getDeclaredMethod("getName",null);
getName = stuClass.getDeclaredMethod("getName", String.class, String.class);
System.out.println("【获得指定方法】"+getName);
Constructor<?>[] declaredConstructors = stuClass.getDeclaredConstructors();
System.out.println("【获取类的所有构造函数】");
for (int i = 0; i < declaredConstructors.length; i++) {
System.out.println(declaredConstructors[i]);
}
Constructor<?>[] constructors = stuClass.getConstructors();
System.out.println("【获取类的public构造函数】");
for (int i = 0; i < constructors.length; i++) {
System.out.println(constructors[i]);
}
Constructor<Stu> declaredConstructor = stuClass.getDeclaredConstructor();
//System.out.println("【获得指定构造函数】"+declaredConstructor);
declaredConstructor = stuClass.getDeclaredConstructor(Integer.class, String.class);
System.out.println("【获得指定构造函数】"+declaredConstructor);
}
}
class Stu{
private int id;
private String name;
public int o;
public Stu(){
this.name="!!!!";
}
private Stu(Integer id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public Stu setId(int id) {
this.id = id;
return this;
}
public String getName() {
return name;
}
public String getName(String param1,String param2) {
return name;
}
public Stu setName(String name) {
this.name = name;
return this;
}
private void privateM(){
}
@Override
public String toString() {
return "Stu{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
![]()