Java 反射技术应用广泛,它能够配置:类的全限定名、方法和参数,完成对象的初始化,甚至是反射某些方法。这样就可以大大增强Java 的可配置性,Java 的反射内容繁多,包括对象构建、反射方法、注解、参数、接口等。
以一个实体类为例
构建对象(不带构造参数)
public class Book {
public void read(String bookName) {
System.out.println("I am reading " + bookName);
}
}
//对象构建方式:
Book book = (Book)Class.forName("com.lanhm.test").newInstance();
上面的代码是通过Class.forName给类加载器注册了一个Book类,然后通过newInstance 方法初始化了一个类对象,此方法只能映射默认无参的构造方法,如果类中存在带有参数的构造方法,则需要使用下面的反射方式构造对象
构建对象(带构造参数)
public class Book {
public Book(String bookName, String price) {
super();
//...
}
}
//对象构建方式:
Book mBook = (Book)Class.forName("com.lanhm.test").getConstructor(String.class, Long.class).newInstance("java从入门到放弃", 98.9);
String.class为构造方法参数的类型,后面的参数则传入参数的对应value。
反射方法
public class Book {
public void setName(String bookName) {
System.out.println("my name is " + bookName);
}
}
//通过反射Book类的setName方法来调用setName方法
Book book= new Book();
try {
Method method = Book.class.getMethod("info", String.class);
method.invoke(book, "<<Thinking in Java>>");
}catch (NoSuchMethodException | SecurityException
| IllegalAccessException | IllegalArgumentException
| InvocationTargetException e) {
e.printStackTrace();
}
输出结果:my name is <<Thinking in Java>>
Method method = Book.class.getMethod("info", String.class);
第一个参数是方法名称,第二个参数是参数类型,是一个可变参数;
method.invoke(book, "<<Thinking in Java>>");
第一个参数为类对象 , 确定用哪个对象调用方法,而"<<Thinking in Java>>"是参数,这行就等同于
target.setName("<<Thinking in Java>>") ,也是一个可变参数。
Class的常用API方法
- newInstance():通过构造方法创建类的对象
- getName():获取类的名字
- getFields():获取类的公有属性
- getDeclaredFields():获取类的所有属性
- getMethods():获取类的公有类型的方法
- getDeclaredMethods():获取类的所有方法
- getMethod(String name, Class[] parameterTypes):获得类的指定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
- getConstructors():获得类的public类型的构造方法。
- getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。