反射常用的一些方法
- getName() 获取名称
- getSimpleName() 获取简称
- getModifiers() 获取访问修饰符
- getParameterTypes() 获取参数列表
反射获取Class类实例的三种方式:
- 对象.getClass()
- 类名.clsss
- Class.forName(“全限定名”)
newInstance()
创建此 Class 对象所表示的类的一个新实例。
例如:Class<Goods> cls = Goods.class;
Goods = cls.newInstance();//调用的是无参构造
- 第三种和前面两种的区别:
- 前两种必须明确类型。后面是你只要提供这种类型的字符串就行,这种扩展更强,我不需要知道你的类,我只提供字符串,按照配置文件加载就可以了。
/*
* 商品类
*/
public class Goods {
private String name;//商品名称
private Double price;//商品的价格
private Integer storage;//库存
....//有参无参构造、get/set方法
}
/*
* 反射获取Class类实例的三种方式
* 第一种方式:
* 利用对象调用getClass()方法获取该对象的Class实例
* 对象.getClass()
* 例如:Class cls = new Student().getClass();
*
* 第二种方式:
* 类名.class
* 例如:Class cls = Student.class;
*
* 第三种方式:这种方式比较常用 推荐 一般开发的时候都是用这种方式
* 使用Class类的静态方法forName("包名.类名"),用类的名字获取一个Class实例。
* Class.forName("全限定名");
* 例如:Class cls = Class.forName("entity.Student");
*/
public static void main(String[] args) throws ClassNotFoundException {
//获取Goods运行时类
//第三种获取方式
Class<?> cls = Class.forName("demo1.Goods");
//第二种方式
Class cls1 = Goods.class;
//第一种方式
//缺点必须创建这个对象,首先有这个类,如果没有直接报错
Class<? extends Goods> cls2 = new Goods().getClass();
}
获取运行时类实现的接口以及父类
(1)获取父类 getSuperclass()
(2)获取实现接口 getInterfaces()
//书类
public interface Book {
}
public class Dog {
public Integer gid;
public String gname;
....//get/set方法
}
public class Goods extends Dog implements Book{
public Integer id;//商品编号
private String name;//商品名称
private Double price;//商品的价格
private Integer storage;//库存
...//get/set
public static void main(String[] args) {
//1.获取运行时类
Class cls = Goods.class;
//2.获取实现的接口
Class[] interfaces = cls.getInterfaces();
for (Class class1 : interfaces) {
//getName()获取名称
String name = class1.getName();
System.out.println(name);
//getSimpleName()获取简称
String simpleName = class1.getSimpleName();
System.out.println(simpleName);
}
//3.获取父类
Class cls2 = cls.getSuperclass();
System.out.println(cls2.getName());
System.out.println(cls2.getSimpleName());
}
通过反射获取构造方法
-
getConstructor(Class<?>… parameterTypes) 获取指定公共构造
-
getConstructors() 获取本类所有的公共构造
-
getDeclaredConstructor(Class<?>… parameterTypes) 获取本类指定的构造(共有或私有)
-
getDeclaredConstructors() 获取本类所有的构造
-
创建对象
newInstance()
con.newInstance(“zhangsan", 20);
- 加Declared和不加Declared区别?
- 加Declared可以获取本类所有的东西,不加Declared获取本类以及父类公共的东西
- 加s和不加s的区别?
- 加s获取是多个,返回数组。 不加s返回单个。
public static void main(String[] args) throws Exception {
//1.创建运行时类
Class<Goods> cls = Goods.class;
System.out.println("------------getConstructors()方法------------");
//2.获取构造
//调用getConstructors() 获取本类所有的公共构造
Constructor[] constructors = cls.getConstructors();
//遍历运行时类里所有的构造
for (Constructor constructor : constructors) {
//获取访问修饰符
//getModifiers() 返回此类或接口以整数编码的 Java 语言修饰符。