1.获取类的三种方式

第一种:使用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();

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

2.获取构造函数

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());}

获取名字
返回类型: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;//PublicField[] 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)  //不可访问//默认是falseField 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);    //使用方法

以上都是常用的方法,不仅仅只有这些!

通过反射访问私有变量:

public class Test{public static void main(String[] args) throws Exception {//获得Dog类的Class对象Class<?> classType = Class.forName("Dog");//生成对象的实例Object obj = classType.newInstance();//取得dogName属性Field dogName = classType.getDeclaredField("dogName");//禁止Field的访问控制检查dogName.setAccessible(true);//将Field的值设为“Xiao Qiang”dogName.set(obj, "Xiao Qiang");//取得say()方法Method say = classType.getDeclaredMethod("say", new Class[]{});//禁止say方法的访问控制检查say.setAccessible(true);//调用say方法say.invoke(obj, new Object[]{});}}class Dog {//私有的属性private String dogName = "Wang Cai";//私有的方法private void say() {System.out.println(dogName + ": Wang Wang");}
}

java反射的三种方式以及一些常用方法相关推荐

  1. Java操作Excel三种方式POI、Hutool、EasyExcel

    Java操作Excel三种方式POI.Hutool.EasyExcel 1. Java操作Excel概述 1.1 Excel需求概述 1.2 Excel操作三种方式对比 2. ApachePOIExc ...

  2. Java循环的三种方式分享

    转自: Java循环的三种方式分享 下文笔者讲述java循环的三种方式分享,如下所示 一.while循环 while语法:while(循环条件){循环体}while关键字处理循环先判断循环条件当条件成 ...

  3. 面试官 | Java转List三种方式,你说说吧。我。。懵逼。啥时候有三种了

    Hi 我是小小,我们又见面了,本文主要介绍Java数组转List的三种方式以及对比 前言 本文主要介绍Java中数组转为List的三种情况的优劣对比,以及应用场景. 第一种 通过 Arrays.asL ...

  4. java实现线程三种方式_详解三种java实现多线程的方式

    java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 public class thread1 extends Thread ...

  5. Jmeter引用外部Java文件的三种方式

    首先,我们来了解一下Jmeter引用外部Java文件的应用场景:说一个最常见的场景,比如做接口测试时,登录接口密码为加密传输,加密的算法由后端开发提供,只要后端开发语言是Java,那么他提供给你的加密 ...

  6. Java反射实现几种方式

    可以通过 实现给私有属性赋值Field field_qt = form.gettSswageTrtmt().getClass().getDeclaredField(runParam); field_q ...

  7. java深拷贝的三种方式

    问题:spring boot/JPA项目中,修改某个对象以后需要生成一个VO对象给客户端,数据库对应的POJO对象里有个Map类型的对象(名字叫para),这个对象的value又是个Map,我使用Ma ...

  8. java字符串反转三种方式

    将一个字符串进行反转.将字符串中指定部分进行反转.比如"abcdefg"反转为"abfedcg". public class StringDemo {/*将一个 ...

  9. Java数组初始化三种方式

    初始化方式: 静态初始化 int[] intArr; intArr = new int[]{1,2,3,4,5,9}; 简化的静态初始化方式 String[] strArr = {"张三&q ...

最新文章

  1. mysql支持UUID做外键_多表外键下将普通的id主键更新为uuid主键
  2. 前端开发模式--MV*
  3. k8s+jenkins
  4. 2017的中国开放_2017年开放科学如何发展
  5. mysql 启动服务1067_windows无法启动MySQL服务报错1067的解决方法
  6. 如何收集常见的前端性能信息
  7. javax.xml.ws.WebServiceException: Provider com.sun.xml.ws.spi.ProviderImpl not found
  8. 大整数乘法——分治算法的时间复杂度
  9. Hyper-v中安装centos网卡故障
  10. 仿网易云音乐html代码,HTML作业-仿网易云音乐项目
  11. 计算机视觉算法与应用汇总
  12. 空间点到直线的距离c语言,空间两直线间距离公式(文档篇).doc
  13. sobel边缘检测java_Sobel边缘检测
  14. 【BZOJ3837】[Pa2013]Filary 随机化神题
  15. Grubbs Test
  16. 百度地图离线API2.0(含示例,可完全断网访问)
  17. 在计算机网络俗称网上邻居上能看到自己,为什么在“网上邻居”中可以看到自己,却看不到其他联网电脑?...
  18. win7和linux双系统怎么切换,使用easybcd完美实现windows7与linux双系统的详细步骤
  19. (初学者)使用DOSBox编写汇编程序
  20. 3par存储与linux系统多路径适配问题解决方案

热门文章

  1. redis失效策略和删除策略
  2. stm32和电机开发(开篇)
  3. 锐捷网络与锐安科技达成战略合作,合力助推公安大数据新发展
  4. Contest 20140923 潛行世界 拓撲排序,期望
  5. apache winnt_accept: Asynchronous AcceptEx failed 导致时常卡住解决办法
  6. 解决WebStorm 中文输入法下候选框不能跟随光标的问题
  7. 泛微OA的介绍以及实施计划
  8. 微信小程序 不二博客星球
  9. 革命性:美国、英国和北爱尔兰在量子信息科学方面建立政府双边政策合作
  10. electron cookies 应用与封装