2020-10-19

java反射方法和使用
    java中不通过new关键字获取对象并且使用类对象中的成员变量和方法,第一时间我们会想到可以使用反射去实现这些功能,反射很强大,学会了我们可以搭配很多东西一起使用,下面我们一起来学习使用反射吧!
   我们使用一个Book类来实现一下反射
    代码如下:

复制代码
public class Book {
private Integer id;
private String name;
public Integer age;

public Book() {
    System.out.println("Public 无参构造函数");
}
public Book(String name) {
    System.out.println("Public 带参构造函数");
}
private Book(String name,Double price){
    System.out.println("Private 带两参构造函数");
}

public void printAll(){
    System.out.println("公开方法");
}

private void printOne(){
    System.out.println("私有方法");
}

}
复制代码

获取类的三种方式
    第一种:使用Class.forName(String classPath)  //ClassPath:写需要反射的类名,一般是以包名.类名

注意事项:这里会产生一个ClassNotFoundException异常,我们需要将异常处理或者抛出

返回值:Class对象

try {
   Class clz = Class.forName(“com.entity.Book”);
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  }
    第二种:直接使用Class clz = 类名.class

这种情况一般在我们知道有这个类的时候去使用

Class clz = Book.class;
    第三种:Class clz = 对象. getClass();

前提是对象已经被实例化出来了

Book book = new Book();
Class clz = book.getClass();

总结:这三种方法都有各自的优点,一般我们使用第一种比较多,按照自己的实际需求去使用才是最好的

获取构造函数
   getDeclaredConstructors();    获取所有的构造函数

getDeclaredConstructor(参数类型);  获取一个所有的构造函数

getConstructors();          获取所有公开的构造函数

getConstructor(参数类型);        获取单个公开的构造函数

使用方法:

复制代码
//获取所有的构造函数
Constructor[] constructors = clz.getDeclaredConstructors();
//获取单个所有的构造函数
try {
Constructor constructor =
clz.getDeclaredConstructor(String.class);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}

    //获取所有的公开构造函数
    Constructor[] constructors1 = clz.getConstructors();
    //获取单个公开构造函数
    try {
        Constructor constructor = clz.getConstructor(String.class);
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }        

复制代码
  获取修饰符
   getModifiers();  //获取所有修饰符

返回类型:整数类型,如果有两个修饰符,则返回两个修饰符之和,例如public static void getAll(){ }

返回值会是public和static之和

整数定义:

0–默认不写 1–public 2–private 4–protected
   8–static 16–final 32–synchronized
   64–volatile 128–transient 256–native
   512–interface 1024–abstract

for (Constructor constructor : constructors) {
System.out.println(constructor.getModifiers());
}

Modifier.isStatic(clz.getModifiers) //判断是否是static类型

Modifier中还有一些判断其它的方法,都是以is开头

获取名字
   返回类型:String,可以反射类名,方法名,构造函数名等等

getName();    //获取全名 例如:com.bean.Book

getSimpleName()  //获取类名 例如:Book

Class clz = Book.class;
String name1 = clz.getName();
String name2 = clz.getSimpleName();

获取包
   返回类型:package

getPackage();

Package aPackage = clz.getPackage();

获取接口
   返回类型:Class[] interfaces

getInterfaces()

Class[] interfaces = clz.getInterfaces();

获取父类/超类
   返回类型:Class superclass

getSuperclass()

Class superclass = clz.getSuperclass();

获取方法
   getMethods()  //获取所有公开的方法

注意:它会将系统自带的方法也得到

Class clz = Class.forName(“Book”);
Method[] methods = clz.getMethods(); //获取所有的公开方法
for (Method method : methods) {
System.out.println(method.getName());
}

getMethod(String name)  //获取单个公开的方法,参数是可以指定方法名

Method method = clz.getMethod("printAll");        //获取单个的公开方法
method.invoke(clz.newInstance(),null);

getDeclaredMethods()   //获取所有的方法

注意:它不会获取系统自带的方法

Method[] methods1 = clz.getDeclaredMethods();    //获取所有方法
for (Method method1 : methods1) {
     System.out.println(method1.getName());
}    

getDeclaredMethod(String name)    //获取单个的所有方法 参数是可指定方法名

Method method1 = clz.getDeclaredMethod("printOne");    //获取单个所有的方法
System.out.println(method1.getName());

获取字段
   公开(Public)

getFields()   //获取所有的公开字段

getField(String name)  //参数可以指定字段  获取单个public字段

所有

getDeclaredFields()  //获取所有的字段

getDeclaredField(String name)  //获取单个字段 参数可以指定字段

复制代码
Class clz = Book.class;
//Public
Field[] fields = clz.getFields(); //所有公开字段
Field id = clz.getField(“age”); //age字段
//所有
Field[] declaredFields = clz.getDeclaredFields(); //所有字段
clz.getDeclaredField(“name”); //name字段
复制代码

实例化对象
   newInstance(Object initargs)

第一种方式

Class clz = Book.class;
  Object obj = clz.newInstance(); //将创建一个无参book对象
   第二种方式

Class clz = Book.class;
  Constructor constructor = clz.getDeclaredConstructor(); //获得无参构造
  Object obj = constructor.newInstance(); //实例化book对象

设置访问属性
   clz.setAccessible(true)  //可访问

clz.setAccessible(false)  //不可访问

//默认是false

Field id = clz.getField(“age”); //age字段  
id.setAccessible(true); //设为可访问
id.setAccessible(false); //设为不可访问

使用方法
   method.invoke(Object obj,Object… args)

obj:如果是实例方法,则放个该方法的类对象给它

obj:静态方法,写null

args:方法的参数值,没有写null,或不写都行

Method method = clz.getMethod("printAll");        //获取单个的公开方法
method.invoke(clz.newInstance(),null);    //使用方法

当然,这些都只是常用的,反射不仅仅是只有这些

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值