一、 注解的定义
反射是通过class文件对象获取java类的构造方法、成员方法、属性、静态代码块等。
二、使用
- 获取字节码文件
//1.通过Object的getClass()方法
Class cls = person.getClass()
//2.通过数据类型的静态属性class
Class cls = Person.class
//3.通过Class类的静态方法forName()
Class cls = Class.forName("com.jiyun.Person");
- 通过反射获取无参构造、有参构造、私有构造方法并使用
实体类:
public class Dog {
private String name;
public String color;
public static String des = "狗有四条腿,长舌头,汪汪叫";
public Dog() {
}
public Dog(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void show() {
System.out.println("我是" + name);
}
public int cal(int a, int b) {
return a + b;
}
public static void profile() {
System.out.println("狗是人类的朋友");
}
}
(1)反射获取无参构造
代码:
//反射获取无参构造两种方式
Constructor<?> constructor = cls.getConstructor();
Constructor<?> constructor = cls.getConstructor(null);
案例:
public class Test {
public static void main(String[] args) throws Exception {
Class<Dog> cls = Dog.class;
//1.获取无参构造方法并使用
Constructor<?> constructor1 = cls.getConstructor();
// Constructor<?> constructor1 = cls.getConstructor(null);
//通过无参构造方法生成对象:
Object obj1 = constructor1.newInstance();
// Object obj1 = constructor1.newInstance(null);
Dog dog = (Dog) obj1;
dog.setName("哈士奇");
dog.show();
}
}
(2) 反射获取有参构造方法
代码:
//反射获取有参构造方法
Constructor<?> constructor = cls.getConstructor(new Class[]{String.class});
案例:
public class Test {
public static void main(String[] args) throws Exception {
Class<Dog> cls = Dog.class;
//2.获取有参构造方法并使用
Constructor<?> constructor = cls.getConstructor(new Class[]{String.class});
//通过无参构造方法生成对象:
Object obj = constructor.newInstance(new Object[]{"哈士奇"});
Dog dog = (Dog) obj;
dog.show();
}
}
(3) 反射获取私有构造方法
代码:
//反射获取私有构造方法
Constructor<?> constructor = cls.getDeclaredConstructor();
案例:
public class Test {
public static void main(String[] args) throws Exception {
Class<Dog> cls = Dog.class;
//获取私有构造方法并使用
Constructor<?> constructor = cls.getDeclaredConstructor();
//通过无参构造方法生成对象:
constructor.setAccessible(true);
Object obj = constructor.newInstance();
Dog dog = (Dog) obj;
dog.setName("哈士奇");
dog.show();
}
}
-
通过反射获取无参无返回值、带参有返回值成员方法并使用
(1)获取无参无返回值的方法
代码://获取无参无返回值的方法 Method mth = cls.getMethod("show"); Method mth = cls.getMethod("show",null);
案例:
public class Test { public static void main(String[] args) throws Exception { Class<Dog> cls = Dog.class; Constructor<?> constructor1 = cls.getConstructor(); Object obj = constructor1.newInstance(); Dog dog = (Dog) obj; //获取无参无返回值的方法 Method mth = cls.getMethod("show"); // Method mth = cls.getMethod("show","哈士奇"); //调用show方法: dog.setName("哈士奇"); // mth.invoke(obj, nul); mth.invoke(dog); }
(2)获取有参有返回值的方法
代码:
//获取有参有返回值的方法
Method mth = cls.getMethod("cal", new Class[]{int.class,int.class});
案例:
public class Test {
public static void main(String[] args) throws Exception {
Class<Dog> cls = Dog.class;
Constructor<?> constructor1 = cls.getConstructor();
Object obj = constructor1.newInstance();
//2.获取有参有返回值的方法
Method mth = cls.getMethod("cal", new Class[]{int.class,int.class});
//调用cal方法:
Object result = mth.invoke(obj,new Object[]{2,6});
int sum = (int) result;
System.out.println(sum);
}
}
(3)获取无参无返回值静态方法
代码:
//获取无参无返回值静态方法
Method mth = cls.getMethod("profile");
Method mth = cls.getMethod("profile",null);
案例:
public class Test {
public static void main(String[] args) throws Exception {
Class<Dog> cls = Dog.class;
//获取无参无返回值静态方法
Method mth = cls.getMethod("profile");
// Method mth = cls.getMethod("profile",null);
//调用静态方法
mth.invoke(null);
// mth.invoke(null,null);
}
}
-
通过反射获取成员变量并使用
(1)获取非私有成员变量
代码://获取非私有成员变量 Field field = cls.getField("color");
案例:
public class Test { public static void main(String[] args) throws Exception { Class<Dog> cls = Dog.class; Constructor<?> constructor1 = cls.getConstructor(); Object obj = constructor1.newInstance(); //1.获取非私有成员变量 Field field = cls.getField("color"); //给非私有成员变量赋值: field.set(obj, "yellow"); //获取非私有成员变量的值: Object color = field.get(obj); System.out.println("狗的颜色是:"+color); } }
(2)获取私有成员变量
代码:
//获取私有成员变量
Field field = cls.getDeclaredField("name");
案例:
public class Test {
public static void main(String[] args) throws Exception {
Class<Dog> cls = Dog.class;
Constructor<?> constructor1 = cls.getConstructor();
Object obj = constructor1.newInstance();
//2.获取私有成员变量
Field field = cls.getDeclaredField("name");
//给私有成员变量赋值:
field.setAccessible(true);
field.set(obj, "大黄");
//获取私有成员变量的值:
field.setAccessible(true);
Object name = field.get(obj);
System.out.println("狗的名字是:" + name);
}
}
(3)获取静态成员变量
代码:
//获取私有成员变量
Field field = cls.getField("des");
案例:
public class Test {
public static void main(String[] args) throws Exception {
Class<Dog> cls = Dog.class;
//获取静态成员变量
Field field = cls.getField("des");
//给静态成员变量赋值:
field.set(null, "啦啦啦");
//获取非私有成员变量的值:
Object des = field.get(null);
System.out.println("狗得描述:" + des);
}
}
网友评论