类成员的反射实现:
1.通过反射来实例化对象:
2.获取所有的构造方法:
3.获取属性:
4.获取类所在的包名:
5.获取类中所有的方法:
1.通过反射来实例化对象:
通过Class类中的newInstance()方法,(调用类中默认无参的构造方法)来实例化对象.
案例:
@Test
public void test2() throws IllegalAccessException, InstantiationException {
Class<Dog> dogClass = Dog.class;
//通过Class对象来实例化类对象,(调用了默认无参的构造方法)
Dog dog = (Dog)dogClass.newInstance();
}
2.获取所有的构造方法:
getConstructors()通过该方法获取所有的构造方法,并且可以通过这些构造方法来实例化对象.
案例:
@Test
public void test3() throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException {
//**********获取所有构造器***********
Class<Dog> dogClass = Dog.class;
Constructor<?>[] constructors = dogClass.getConstructors();
for (int i = 0; i <constructors.length ; i++) {
System.out.println(constructors[i].getName());
System.out.println(constructors[i]);
}
//*********通过构造器来实例化对象**********
Dog dog1= (Dog)constructors[0].newInstance("小红", 2, "red");
System.out.println(dog1);
//**********获取一个指定的构造方法********
Constructor<Dog> constructor = dogClass.getConstructor(String.class, int.class, String.class);
//通过获取的构造器中的newInstance()方法实例化类对象
Dog dog = constructor.newInstance("小白", 2, "black");
System.out.println(dog);
}
3.获取属性:
getFields()该方法无法获取私有属性.
getDeclaredFields()获取所有属性(包括私有属性)
getModifiers()获取修饰符 , Modifier.toString()将获取的修饰符的编码转换为字符串形式.
案例:
@Test
public void test4(){
Class<Dog> dogClass = Dog.class;
//获取非私有属性
Field[] fields = dogClass.getFields();//该方法无法获取私有的属性.
System.out.println("获取的属性的个数:"+fields.length);
//获取所有属性(包括私有属性)
Field[] declaredFields = dogClass.getDeclaredFields();
System.out.println("获取的属性的个数:"+declaredFields.length);
//getModifiers()获取修饰符 , Modifier.toString()将获取的修饰符的编码转换为字符串形式.
for (int i = 0; i <declaredFields.length ; i++) {
System.out.println(Modifier.toString(declaredFields[i].getModifiers()) + " "+declaredFields[i].getName());
}
}
4.获取类所在的包名:
getPackage() 获取类所在的包名.
案例:
@Test
public void test5(){
Class<Dog> dogClass = Dog.class;
Package aPackage = dogClass.getPackage();
System.out.println(aPackage.getName());
}
5.获取类中所有的方法:
1.getMethods() 获取所有的公有方法,包括从父类继承的方法;
2.通过Method中的invoke()方法(参数,第一个是作用的对象名,后面的是所调用的函数所带的参数)来调用Method对象所获取的方法.
3.getDeclaredMethods()获取所有声明的方法,包括私有的方法,但是不包括从父类中继承的方法
4.再调用获取的私有方法时需要通过setAccessible()方法设置私有方法可访问(去掉访问修饰符的检测);
案例:
@Test
public void test6() throws InvocationTargetException, IllegalAccessException {
Dog dog = new Dog("小白", 2, "白色");
Class<Dog> dogClass = Dog.class;
//获取所有的公有方法,包括从父类继承的方法;
Method[] methods = dogClass.getMethods();
for (int i = 0; i <methods.length ; i++) {
System.out.println(methods[i].getName());
if(methods[i].getName().equals("toString")){
//通过Method中的invoke()方法(参数,第一个是作用的对象名,后面的是所调用的函数所带的参数)来调用Method对象所获取的方法.
String string = (String)methods[i].invoke(dog);
System.out.println(string);
}
}
System.out.println("--------------------------------");
//获取所有声明的方法,包括私有的方法,但是不包括从父类中继承的方法
//再调用获取的私有方法时需要通过setAccessible()方法设置私有方法可访问(去掉访问修饰符的检测);
Method[] declaredMethods = dogClass.getDeclaredMethods();
for (int i = 0; i <declaredMethods.length ; i++) {
System.out.println(declaredMethods[i].getName());
if(declaredMethods[i].getName().equals("play")){
//设置私有方法可访问(去掉访问修饰符的检测);
declaredMethods[i].setAccessible(true);
declaredMethods[i].invoke(dog);
}
}
}
```