反射机制的应用
package com.iflysse.test04;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import org.junit.Test;
/**
*Java的反射机制:
* 对象-->运行时类对象-->类的所有信息
*/
public class Day040601 {
@SuppressWarnings("rawtypes")
//由反射机制获取属性
@Test
public void test01() throws ClassNotFoundException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
Person p = new Person();
Class cla1 = p.getClass(); //通过对象名.getclass()的方式来获取类的运行时类对象;
Class cla2 = Person.class; //通过类名.class的方式
Class cla3 = Class.forName("com.iflysse.test04.Person"); //通过Class.forName("className")的方式
//一个类只生成一个运行时类对象,不管用什么方法获取,都是一样的。
System.out.println(cla1 == cla2);
System.out.println(cla2 == cla3);
//Field[] field = cla1.getFields();//获取的是所有的公有的属性(包括父类的)
Field[] field = cla1.getDeclaredFields(); //获取本类中所有的属性(不包括父类)
for(Field ele:field){
System.out.println(Modifier.toString(ele.getModifiers())+" "+ele.getType()+" "+ele.getName());
} //获取权限修饰符 获取数据类型 获取属性名
//获取单个属性name
Field fname = cla1.getField("name");
fname.set(p, "小明");
//获取age
Field fage = cla1.getDeclaredField("age");
fage.setAccessible(true);//私有属性对其赋值,将权限设置为true;
fage.set(p, 22);
p.info();
}
----------
//由反射机制获取方法
@Test
public void test02() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
Class cla = Person.class;
Method[] methods = cla.getMethods();//获取所有的公有的方法,包括父类
Method[] methods1 =cla.getDeclaredMethods(); //获取本类中所有的方法,包括私有
for(Method ele:methods1){
System.out.println(ele.getName());//方法名
System.out.println(ele.getModifiers());//权限修饰符
System.out.println(ele.getReturnType());//返回值类型
System.out.println(Arrays.toString(ele.getParameterTypes()));//参数类型
System.out.println(Arrays.toString(ele.getExceptionTypes()));//异常类型
System.out.println(Arrays.toString(ele.getAnnotations()));
}
Person p = new Person();
//...代表可以放0个或者多个参数
Method m = cla.getMethod("show", String.class);
m.invoke(p, "闪闪发亮"); // p.show("闪闪发亮");
Method m1 = cla.getDeclaredMethod("xizao");
m1.setAccessible(true);
m1.invoke(p);
}
----------
//由反射机制创建对象
@Test
public void test03() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException{
Class cla = Class.forName("com.iflysse.test04.Person");
Person p = (Person) cla.newInstance();//一定要有无参构造函数
System.out.println(cla.getSuperclass());//获取父类
System.out.println(cla.getInterfaces());//获取接口
System.out.println(cla.getPackage());
Constructor[] constructors = cla.getDeclaredConstructors();
//获取带参的构造器
Constructor c1 = cla.getConstructor(String.class,int.class);
Person p1 = (Person) c1.newInstance("小明",23);
p1.info();
}
}
----------
class Animals{
public String name1;
@SuppressWarnings("unused")
private int age1;
}
----------
class Person extends Animals{
public String name;
private int age;
public void setAge(int age) {
this.age = age;
}
public Person(){}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public void info(){
System.out.println("我是"+this.name+",今年"+this.age+"了...");
}
public void show(String str){
System.out.println("我是一个"+str+"的人...");
}
private void xizao(){
System.out.println("我爱洗澡,身体好好....");
}
}