Class
public class ClassTest {public static void main(String[] args) {System.out.println(String.class.getName());System.out.println(String.class.getSimpleName());System.out.println(String.class.getPackage().getName());System.out.println(String.class.isInterface());System.out.println(String.class.isEnum());System.out.println(String.class.isPrimitive());}}
访问字段
读取字段名
// 通过类拿到字段名
System.out.println(Student.class.getField("name"));
Field name = Student.class.getField("name");
Field age = Student.class.getDeclaredField("age");
System.out.println(name.getName());
System.out.println(age.getName());
通过实例拿到字段值
// 通过实例拿到字段值
Object stu = new Student("xiaoming",19);
age.setAccessible(true); // 因为 age 是 private 的,所以必须设置这个参数
System.out.println(age.get(stu)); // 19
通过实例设置字段值
// 通过实例设置字段值
age.set(stu,20);
System.out.println(((Student) stu).getAge()); // 20
调用方法
首先定义一个类:
class Student extends People {
public String name;
private int age;
public Student(String name, int age){
this.name = name;
this.age = age;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
public static String getNameAndAge(){
return "Hello this is testing";
}
}
调用普通方法
// 调用方法
Method m = Student.class.getMethod("setAge", int.class);
m.invoke(stu,99);
System.out.println(((Student) stu).getAge()); // 99
调用静态方法
// 调用静态方法
// 无需指定实例,所以实例部分的参数,可以设置为 null
Method staticMethod = Student.class.getMethod("getNameAndAge");
String str = (String) staticMethod.invoke(null);
System.out.println(str); // Hello this is testing
多态
反射也遵循多态的原则
// 多态
Method p = People.class.getMethod("hello");
p.invoke(new Student("xx",12)); // Student:hello
调用构造函数
try{
Constructor con = Teacher.class.getConstructor(String.class, int.class);
Teacher t = (Teacher) con.newInstance("xiaoming",100);
t.hello();
}catch (NoSuchMethodException e){
}catch (Exception e){
}
动态代理
public class ProxyTest {
public static void main(String[] args) {
// 在这里实现了 接口 方法
InvocationHandler invocationHandler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method);
if(method.getName().equals("morning")){
System.out.println("Good Morning " + args[0]);
}
return null;
}
};
// 在这里直接创建实例
Hello hello = (Hello) Proxy.newProxyInstance(
Hello.class.getClassLoader(),
new Class[]{Hello.class},
invocationHandler
);
// 使用方法
hello.morning("Bob");
}
};
interface Hello{
void morning(String name);
}
代码
https://github.com/01x01/Java/blob/master/src/ReflectTest.java
Java Basic

