创建一个待加载的类People
package com.java.demo;
public class People {
private String name;
private int age;
public String phoneNumber;
public People(String name, int age) {
this.name = name;
this.age = age;
}
private People(String name) {
this.name = name;
this.age = 88;
}
public People() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
private void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
", age=" + age +
", phoneNumber='" + phoneNumber + '\'' +
'}';
}
}
三种加载方式
package com.java.demo;
public class Demo4 {
public static void main(String[] args) throws ClassNotFoundException {
Class<People> c1 = com.java.demo.People.class;
System.out.println(c1);
People p = new People();
Class<People> c2 = (Class<People>) p.getClass();
System.out.println(c2);
System.out.println(c1 == c2);
Class<People> c3 = (Class<People>) Class.forName("com.java.demo.People");
System.out.println(c3);
System.out.println(c1 == c2 && c1 == c3);
}
public static Class getClass2(String className) throws ClassNotFoundException {
return Class.forName(className);
}
}
构造方法调用
package com.java.demo;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Demo5 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
Class<People> pClass = (Class<People>) Class.forName("com.java.demo.People");
Constructor<People> c1 = pClass.getConstructor();
People p = c1.newInstance();
System.out.println(p);
Constructor<People> c2 = pClass.getConstructor(new Class[]{String.class, int.class});
People p2 = c2.newInstance("王麻子",99);
System.out.println(p2);
Constructor<People> c3 = pClass.getDeclaredConstructor(String.class);
c3.setAccessible(true);
People p3 = c3.newInstance("李四");
System.out.println(p3);
}
}
加载类获取方法进行调用
package com.java.demo;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Demo6 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
Class c1 = Class.forName("com.java.demo.People");
Constructor c = c1.getConstructor();
Object o = c.newInstance();
Method setName = c1.getMethod("setName", String.class);
Method setAge = c1.getDeclaredMethod("setAge", int.class);
setAge.setAccessible(true);
setName.invoke(o, "张三");
setAge.invoke(o, 18);
System.out.println(o);
}
}
加载类获取成员属性调用
package com.java.demo;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
public class Demo7 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {
Class c = Class.forName("com.java.demo.People");
Constructor ct = c.getConstructor();
Object o = ct.newInstance();
Field phoneNumber = c.getField("phoneNumber");
phoneNumber.set(o, "13822222222");
Field name = c.getDeclaredField("name");
name.setAccessible(true);
name.set(o, "王麻烦");
System.out.println(o);
}
}