今天在代码中看到了invoke方法,了解到原来是使用了反射的机制。
以前没怎么用过这种方式,所以简单的了解一下。
具体内容是简单的写了一套代码。
声明Animal类
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
class Animal {
public Animal() {
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
private int age;
public String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
普通的方法和使用反射
@SuppressWarnings("unchecked")
public void fanshe() throws Exception {
try {
System.out.println("-----------正常调用----------");
Animal animal = new Animal();
animal.setAge(10);
System.out.println("animal age:" + animal.getAge());
System.out.println("-----------使用反射----------");
// 获取需调用的类
Class clz = Class.forName("Animal");
// 获取需调用的函数
Method setPriceMethod = clz.getMethod("setAge", int.class);
// 根据class的实例,获取Constructor实例
Constructor animalConstructor = clz.getConstructor();
// 根据Constructor实例的newInstance(),获取反射类
Object animalObj = animalConstructor.newInstance();
// 使用invoke方法调用反射类的函数
setPriceMethod.invoke(animalObj, 15);
// 只调用方法,只需要下面两个步骤
Method getPriceMethod = clz.getMethod("getAge");
Object age = getPriceMethod.invoke(animalObj);
System.out.println("animal age:" + age);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
反射的常用方法
@SuppressWarnings("unchecked")
public void fansheTest() throws Exception {
try {
// 使用.forName 获取类的对象
Class clz1 = Class.forName("java.lang.String");
System.out.println("-----------Class1----------");
System.out.println(clz1);
// 使用 .class 获取类的对象
Class clz2 = String.class;
System.out.println("-----------Class2----------");
System.out.println(clz2);
// 实例的 .getClass 获取类对象
String str = new String("Hello");
Class clz3 = str.getClass();
System.out.println("-----------Class3----------");
System.out.println(clz3);
// 获取反射类,直接调用class的 newInstance()方法获取
Class clz4 = Animal.class;
Animal animal4 = (Animal) clz4.newInstance();
System.out.println("-----------Class4----------");
System.out.println(animal4.getClass());
// 获取反射类,通过Constructor的newInstance()方法获取
Class clz5 = Animal.class;
Constructor constructor5 = clz5.getConstructor();
Animal animal5 = (Animal) constructor5.newInstance();
System.out.println("-----------Class5----------");
System.out.println(animal5.getClass());
// 获取反射类,指定构造函数的时候
Class clz6 = Animal.class;
Constructor constructor6 = clz4.getConstructor(String.class, int.class);
Animal animal6 = (Animal) constructor6.newInstance("马", 15);
System.out.println("-----------Class6----------");
System.out.println(animal6.getClass());
Class clz = Animal.class;
// 获取类的属性(查不到private属性)
Field[] fields1 = clz.getFields();
System.out.println("-----------fields1----------");
for (Field field : fields1) {
System.out.println(field.getName());
}
// 获取声明的类所有属性
System.out.println("-----------fields2----------");
Field[] fields2 = clz.getDeclaredFields();
for (Field field : fields2) {
System.out.println(field.getName());
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
main里执行
public class main {
public static void main(String[] args){
Animal animal = new Animal();
try{
animal.fanshe();
animal.fansheTest();
}catch (Exception e){
System.out.println(e.getMessage());
}
}
}
编译以后,可以查看结果
$ javac main.java
$ java main
-----------正常调用----------
animal age:10
-----------反射调用----------
animal age:15
-----------Class1----------
class java.lang.String
-----------Class2----------
class java.lang.String
-----------Class3----------
class java.lang.String
-----------Class4----------
class Animal
-----------Class5----------
class Animal
-----------Class6----------
class Animal
-----------fields1----------
name
-----------fields2----------
age
name
欢迎大家的意见和交流
email: li_mingxie@163.com
网友评论