Java定义了三种获取Class对象的方式
public class GetClassDemo {
public static void main(String[] args) throws ClassNotFoundException {
//获取一个类的Class对象的三种方式
//1.通过类的一个静态成员 class
Class clazz1 = Dog.class;
System.out.println(clazz1);
//2.通过该类的一个对象,获取该类的Class对象
Dog dd = new Dog();
Class clazz2 = dd.getClass();
System.out.println(clazz2);
//3.通过反射强制加载该类,并获取该类的Class对象
Class clazz3 = Class.forName("com.itheima.demo02_GetClass.Dog");
System.out.println(clazz3);
//注意:以上是三种获取Dog类Class对象的方式,并不是获取三个Class对象,实际上他们获取的是同一个Class对象
System.out.println(clazz1 == clazz2);
System.out.println(clazz1 == clazz3);
System.out.println(clazz2 == clazz3);
}
}
输出结果:
class com.itheima.demo02_GetClass.Dog
class com.itheima.demo02_GetClass.Dog
class com.itheima.demo02_GetClass.Dog
true
true
true
6.Class对象中的三个方法
public String getName();
public String getSimple();
public Object newInstance();
public class ClassMethodDemo {
public static void main(String[] args) throws IllegalAccessException, InstantiationException {
Class clazz = Dog.class;
//Class对象中三个方法
//1.获取全限定类名
System.out.println(clazz.getName());
//2.获取类名
System.out.println(clazz.getSimpleName());
//3.创建Class对象所代表的那个类的对象,底层实际上使用Dog的无参构造
Dog dog = (Dog) clazz.newInstance();
System.out.println(dog);
}
}
输出结果:
com.itheima.demo03_ClassMathod.Dog
Dog
Dog{age=0, name='null'}
7.通过反射获取构造方法&&使用构造方法创建对象【重点】
反射获取构造方法
public Constructor getConstructor(Class... parameterTypes); 获取单个"public"构造
public Constructor getDeclaredConstructor(Class... parameterTypes);获取单个"任意修饰"构造
public Constructor[] getConstructors(); 获取所有"public"构造
public Constructor[] getDeclaredConstructors();获取所有"任意修饰"构造
public class GetConstructorDemo {
public static void main(String[] args) throws NoSuchMethodException {
//1.反射第一步,先获取Class对象
Dog dd = new Dog();
Class clazz = dd.getClass();
//2.获取单个"public"的构造方法
Constructor con1 = clazz.getConstructor();
System.out.println(con1);
// Constructor con2 = clazz.getConstructor(int.class, String.class);
// System.out.println(con2);
//3.获取单个"任意修饰符"的构造方法
Constructor con3 = clazz.getDeclaredConstructor(int.class, String.class);
System.out.println(con3);
System.out.println("========================");
//4.获取所有"public"构造
Constructor[] cons = clazz.getConstructors();
System.out.println(cons.length);
for (Constructor con : cons) {
System.out.println(con);
}
//5.获取所有"任意修饰符"构造
System.out.println("========================");
Constructor[] conss = clazz.getDeclaredConstructors();
System.out.println(conss.length);
for (Constructor con : conss) {
System.out.println(con);
}
}
}
使用构造方法创建对象
语法:
构造方法对象.newInstance(参数);
@Test
public void test02() throws Exception {
//使用构造
//1.反射第一步,先获取Class对象
Dog dd = new Dog();
Class clazz = dd.getClass();
//2.获取单个"public"的构造方法
Constructor con1 = clazz.getConstructor();
System.out.println(con1);
Constructor con2 = clazz.getConstructor(int.class,String.class);
System.out.println(con2);
//3.使用构造创建对象
Dog dog1 = (Dog)con1.newInstance();
System.out.println(dog1);
Dog dog2 = (Dog)con2.newInstance(10,"旺财");
System.out.println(dog2);
}
输出结果:
public com.itheima.demo04_GetConstructor.Dog()
public com.itheima.demo04_GetConstructor.Dog(int,java.lang.String)
Dog{age=0, name='null'}
Dog{age=10, name='旺财'}
如果是私有构造怎么办
私有构造必须先设置暴力权限,然后才能正常使用,否则抛出IllegalAccessException异常
@Test
public void test02() throws Exception {
//使用构造
//1.反射第一步,先获取Class对象
Dog dd = new Dog();
Class clazz = dd.getClass();
//2.获取单个"public"的构造方法
Constructor con1 = clazz.getConstructor();
System.out.println(con1);
Constructor con2 = clazz.getDeclaredConstructor(int.class,String.class);
System.out.println(con2);
//3.使用构造创建对象
Dog dog1 = (Dog)con1.newInstance();
System.out.println(dog1);
//私有构造,不能直接使用,因为没有权限
//设置暴力访问权限
con2.setAccessible(true);
Dog dog2 = (Dog)con2.newInstance(10,"旺财");
System.out.println(dog2);
}
输出结果:
public com.itheima.demo04_GetConstructor.Dog()
private com.itheima.demo04_GetConstructor.Dog(int,java.lang.String)
Dog{age=0, name='null'}
Dog{age=10, name='旺财'}
8.通过反射获取成员方法&&调用成员方法【重点】
反射获取成员方法
public Method getMethod(String name,Class...args);获取"public"方法
public Method getDeclaredMethod(String name,Class...args);获取"任意修饰"方法
public Method[] getMethods(); 获取所有"public"方法,包括父类继承的
public Method[] getDeclaredMethods(); 获取所有"任意修饰"方法,不包含父类继承的
@Test
public void test01() throws NoSuchMethodException {
//1.获取Class对象
Dog dd = new Dog();
Class clazz = dd.getClass();
//2.获取单个"public"成员方法
Method eat1 = clazz.getMethod("eat");
System.out.println(eat1);
Method eat2 = clazz.getMethod("eat", String.class, String.class);
System.out.println(eat2);
//3.获取单个"任意修饰"成员方法
Method eat3 = clazz.getDeclaredMethod("eat", String.class);
System.out.println(eat3);
System.out.println("=====================");
//4.获取所有的"public"成员方法,包括父类继承的
Method[] methods = clazz.getMethods();
System.out.println(methods.length);
for (Method method : methods) {
System.out.println(method);
}
System.out.println("=====================");
//5.获取所有的"任意修饰"的成员方法,但是不包含父类继承的
Method[] methodss = clazz.getDeclaredMethods();
System.out.println(methodss.length);
for (Method method : methodss) {
System.out.println(method);
}
}
调用成员方法
语法格式:
成员方法对象.invoke(对象名,参数);
@Test
public void test02() throws Exception {
//调用成员方法
//1.获取Class对象
Dog dd = new Dog();
Class clazz = dd.getClass();
//2.获取单个"public"成员方法
Method eat1 = clazz.getMethod("eat");
System.out.println(eat1);
Method eat2 = clazz.getMethod("eat", String.class, String.class);
System.out.println(eat2);
//3.使用成员方法
eat1.invoke(dd);
eat2.invoke(dd,"shi","niao");
}
输出结果:
public void com.itheima.demo05_GetMethod.Dog.eat()
public void com.itheima.demo05_GetMethod.Dog.eat(java.lang.String,java.lang.String)
狗爱吃shi...
狗爱吃shi,爱喝niao
如果是私有的成员方法怎么调用呢?
私有成员方法不能直接调用,必须先设置暴力访问权限,否则抛出IllegalAccessException异常
@Test
public void test02() throws Exception {
//调用成员方法
//1.获取Class对象
Dog dd = new Dog();
Class clazz = dd.getClass();
//2.获取单个"public"成员方法
Method eat1 = clazz.getMethod("eat");
System.out.println(eat1);
Method eat2 = clazz.getMethod("eat", String.class, String.class);
System.out.println(eat2);
Method eat3 = clazz.getDeclaredMethod("eat", String.class);
//3.使用成员方法
eat1.invoke(dd);
eat2.invoke(dd,"shi","niao");
//私有方法不能直接调用,必须先设置暴力访问权限
eat3.setAccessible(true);
eat3.invoke(dd,"shi");
}
输出结果
public void com.itheima.demo05_GetMethod.Dog.eat()
public void com.itheima.demo05_GetMethod.Dog.eat(java.lang.String,java.lang.String)
狗爱吃shi...
狗爱吃shi,爱喝niao
狗爱吃shi