Class类是Reflection API中核心的类,他位于Java.lang.Class

列出一些常用的方法。

- getName() : 获得类的完整名字

- getFields() : 获得类的public类型的属性

- getDeclaredFields() : 获得类的所有属性

- getMethods() : 获得类的public类型的方法

- getDeclaredMethods() : 获得类的所有方法

- getMethod(String name, Class[] parameterTypes) : 获取类的特定方法(name参数指定方法名字,parameterTypes参数指定方法参数类型)

- getConstructors() : 获得类的public类型的构造方法

- getConstructor(Class[] parameterTypes) : 获得类的特定构造方法(parameterTypes参数指定构造方法的参数类型)

- newInstance() : 通过类的不带参数的构造方法创建这个类的一个对象

如果想使用反射,有2个关键的部分

1.获取Class对象

2.获得对象实例

下面来介绍这两个部分:

1.如何获取Class对象

获取某个类或某个对象所对应的Class对象的常用的3种方法

a) 使用Class类的静态方法forName:

Class.forName("java.lang.String");

b) 使用类的.class语法:

String.class;

c) 使用对象的getClass()方法(java.lang.Object类中的方法):

String s = "aa";

Class<?> clazz = s.getClass();

2.如何获得对象实例

大家都知道获得对象实例就是去new一个,其实就是调用对象的构造方法

这里将调用构造方法参数的不同分为两种类型:

a)调用无参数的构造方法:

1.调用Class对象的newInstance()方法:

Class<?> classType = ClassClass.forName("java.lang.String");

Object object = classTpye.newInstance();

2.调用Class对象的Constructor对象的newInstance()方法,传递一个空的Class对象数组作为参数:

Class<?> classType = ClassClass.forName("java.lang.String");

Constructor cons = classType.getConstructor(new Class[]{});

Object object =cons.newInstance(new Object[]{});

b)调用有参数的构造方法:

1.调用Class对象的Constructor对象的newInstance()方法,传递一个可变长的Class对象数组作为参数,本例传递String,int两个参数:

Class<?> classType = ClassClass.forName("java.lang.String");

Constructor cons = classType.getConstructor(new Class[]{String.class, int.class});

Object object =
cons.newInstance(new Object[]{"hello",3});

下面来一个小Demo,由于过于简单这里就只贴代码了

这个demo简单的实现了上面介绍的一些关于反射的用法,算是一个复习巩固:

  1. class Person {
  2. private long id;
  3. private int age;
  4. private String name;
  5. public Person() {
  6. }
  7. public Person(String name, int age) {
  8. this.name = name;
  9. this.age = age;
  10. }
  11. @Override
  12. public String toString() {
  13. return "Name="+getName()+"  Age="+getAge()+"  Id="+getId();
  14. }
  15. public long getId() {
  16. return id;
  17. }
  18. public void setId(long id) {
  19. this.id = id;
  20. }
  21. public int getAge() {
  22. return age;
  23. }
  24. public void setAge(int age) {
  25. this.age = age;
  26. }
  27. public String getName() {
  28. return name;
  29. }
  30. public void setName(String name) {
  31. this.name = name;
  32. }
  33. }

很简单的一个自定义类,两个构造方法,和一些get,set方法,还有一个重写的toString

下面是调用反射的main方法中的代码,主要就是用反射的方法调用Person的带参构造方法给age,name赋值,在调用setId给id赋值,最后调用toString方法打印出结果

  1. public static void main(String[] args) throws Exception {
  2. //获取Person类的Class对象
  3. Class<?> classType = Class.forName("Person");
  4. //调用Person类的两个参数构造方法生成对象
  5. Constructor constructor = classType.getConstructor(new Class[]{String.class, int.class});
  6. Object object = constructor.newInstance(new Object[]{"Dean",25});
  7. //获取setId方法
  8. Method setId = classType.getMethod("setId", new Class[]{long.class});
  9. //调用setId方法设置Id
  10. setId.invoke(object, new Object[]{10});
  11. //调用toString输出结果
  12. Method toString = classType.getMethod("toString", new Class[]{});
  13. String result = (String) toString.invoke(object, new Object[]{});
  14. System.out.println(result);
  15. }

输出结果为:Name=Dean  Age=25  Id=10

最近正在看反射的视频和资料,写这个博文的目的就是对于学习的一个总结吧。

陆续可能会更新一些我总结的更深层的反射知识,希望大家支持

 

最新文章

  1. Windows Service--Write a Better Windows Service
  2. CSS3动画
  3. Linux命令行小插曲
  4. maven pom.xml加载不同properties配置[转]
  5. Nginx配置proxy_pass转发的/路径问题
  6. 【Java】XML解析之DOM
  7. &lt;大学祭&gt;
  8. ThinkPHP中简单的CURD操作
  9. poj 1383 Labyrinth
  10. Webform Lable
  11. perl5 第六章 模式匹配
  12. Postfix+dovecot搭建简单邮箱服务器
  13. dubbo安装
  14. C语言 &gt; 指向指针的指针
  15. Python3数据类型及转换
  16. oracle BLOG图片和CLOG base64码的转换
  17. Android 加了自定义Application后报错 Unable to instantiate activity ComponentInfo ClassNotFoundException
  18. 【BZOJ5317】[JSOI2018]部落战争(凸包,闵可夫斯基和)
  19. python3+selenium框架设计10-发送邮件
  20. python全栈开发day101-认证组件、权限组件、频率组件

热门文章

  1. 56.lambda表达式与绑定以及伪函数和绑定
  2. LA 2531 The K-league 最大流
  3. 荣获CCF(中国计算机学会)高级会员代表资格
  4. IOS打包发布APP的所有详细流程
  5. HTML5多维度数据分析
  6. 手机浏览器,微信浏览器对background-color不显示的问题
  7. 今日SGU 5.1
  8. [AngularFire] Angular File Uploads to Firebase Storage with Angular control value accessor
  9. Java开发者最经常使用19个Linux命令
  10. Android之Socket的基于UDP传输