1.类的 类类型(ClassType)

类的类类型可以用来做很多事,我们可以通过它获取到类的名称,类的路径,类的成员变量,类的方法等等,还可以通过它获得类的实例化对象。

我们可以通过 类名.class 来得到类的类类型,如下面的 c1

Class c1 = ReflectDemo.class;

我们可以通过类的实例对象得到类的类类型

ReflectDemo demo1 = new ReflectDemo();
Class c2 = demo1.getClass();

还可以通过类的包路径加类名获得类的类类型

Class c3 = Class.forName("reflectdemo.ReflectDemo");

值得注意的是,每个类只有一个类类型,也就是说上面的 c1, c2 , c3 指向的是同一个对象。

在开头也说了,类的类类型同样可以得到类的实例,所以两者可以相互得到。

类自身,类的类类型 和 类的实例对象 的关系如下图:

2.通过类的类类型获取类的成员变量以及方法

自己写了一个方法,通过传入某个类的实例对象,就能得到该类的方法。

其中 getMethod() 方法是获取类中所有public方法,包括父类的 public 方法;getDeclareMethod()方法可以获取本类中声明的所有方法,不论权限

    public static void getClassMethods(Object obj){
Class c = obj.getClass(); //获取类类型
Method []ms = c.getMethods(); //获取类中所有的public方法,包括父类中的方法
Method []ms2 = c.getDeclaredMethods(); ////获取该类自己声明的所有方法,不论权限
Field []fields = c.getFields(); //获取类中public级成员变量
for(Field f:fields){
String fieldType = f.getType().getSimpleName(); //获得成员变量类型
String fieldName = f.getName(); //获得成员变量名
System.out.println(fieldType+" "+fieldName);
} for(Method m:ms){
String type = m.getReturnType().getName(); //方法的返回值类型
System.out.print(type+" ");
String methodName=m.getName(); //方法名
System.out.print(methodName+"(");
Class []params = m.getParameterTypes(); //方法中 参数的类类型 元组 for(Class param:params){
String parName = param.getName(); //从参数类类型中得到参数名
System.out.print(parName+" ");
}
System.out.println(");");
} }

 3.通过反射来操作方法

除了上面通过getMethods()和getDeclaredMethods()获取方法数组之外,还可以通过getMethod()和getDeclaredMethod()来对单个方法进行查找。

这时就要注意,想要定位一个方法,必须要传入正确的方法名以及参数类类型才行。如下:

public class ReflectDemo2 {

    public void print(){
System.out.println("a+b");
} public String add(String a,String b){
return a+b;
} public int add(int a,int b){
return a+b;
}
}

我们想要获取对应的方法就要进行如下操作:

        ReflectDemo2 demo=new ReflectDemo2();
Class c=ReflectDemo2.class;
try {
//通过传入的方法名称和参数类类型来获得某一确定方法的类类型
// Method m1=c.getMethod("add", new Class[]{int.class,int.class}); //第一个参数为方法名,后面既可以传入一个类类型数组,也可以单独地传入类类型
Method m1=c.getMethod("add",int.class,int.class);
Object obj = m1.invoke(demo, ,); //通过invoke()来执行方法,要传入类的实例对象以及对应参数的值
System.out.println(obj); Method m2=c.getMethod("print"); //如果没有参数要传入,直接输入方法名即可
m2.invoke(demo); //如果方法没有返回值,可以不用获取
} catch (Exception e) {
e.printStackTrace();
} }

结果和平常使用类的实例对象调用方法的结果是一样的。

待编辑。。

java反射的学习的更多相关文章

  1. JAVA反射机制—学习总结

    最近收到很多关于Java反射机制的问题留言,其实Java反射机制技术方面没有太多难点,或许是大家在学习过程中遗漏了细小知识点,导致一些问题无法彻底理解,现在我们简单的总结一下,加深印象.什么是反射机制 ...

  2. 云笔记项目-Java反射知识学习

    在云笔记项目中,补充了部分反射的知识,反射这一部分基础知识非常重要,前面学习的框架Spring和MyBatis读取xml配置文件创建对象,以及JDBC加载驱动等都用了反射,但只知道有这个东西,具体不知 ...

  3. Java反射机制——学习总结

    前几天上REST课,因为涉及到Java的反射机制,之前看过一直没有用过,有些遗忘了,周末找了些资料来重新学习,现在总结一下,加深印象. 什么是反射机制? 参考百度百科对java反射机制的定义: “JA ...

  4. Java反射机制学习与研究

    Java反射机制:可以获取正在运行时的Java对象. 1.判断运行时对象对象所属的类. 2.判断运行时对象所具有的成员变量和方法. 3.还可以调用到private方法,改变private变量的值. S ...

  5. Java 反射机制学习资料

    Java反射——引言 Java反射——Class对象 Java反射——构造函数 Java反射——字段 Java反射——方法 Java反射——Getter和Setter Java反射——私有字段和私有方 ...

  6. Java反射机制学习

    Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”. 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答 ...

  7. JAVA反射机制学习随笔

    JAVA反射机制是用于在运行时动态的获取类的信息或者方法,属性,也可以用来动态的生成类,由于所有类都是CLASS的子类,我们可以用一个CLASS类的实例来实例化各种类 例如: Class<?&g ...

  8. java反射机制学习代码

    根据 http://www.iteye.com/topic/137944 文档进行学习 代码如下: package reflectTest; import java.lang.reflect.*; i ...

  9. Java反射篇学习笔记

    今天重新学习了java中的反射,写一篇学习笔记总结一下.代码基本都是照着两篇博客敲的: 参考一:   https://blog.csdn.net/sinat_38259539/article/deta ...

  10. java反射机制学习小结

    之前一直对java的反射机制理解得很模糊,今天因为学习spring,所以花了些时间总算把它理顺了,记录一下 另外,推荐读读这篇文章,写的挺好的http://blog.csdn.net/woshixuy ...

随机推荐

  1. SystemVerilog基本语法总结(上)

    SystemVerilog基本语法总结(上) 在总结SV的语法之前,先分享一些关于SV的笔试题目,这样更显得具有针对性的总结. a. 验证中,代码覆盖率是指(衡量哪些设计代码在激活触发,而哪一些则一直 ...

  2. CH8 课后习题

    8.1和8.2 #include <iostream> using namespace std; istream& f(istream& in) { int v; in & ...

  3. Celery的常用知识

    什么是Clelery   Celery是一个简单.灵活且可靠的,处理大量消息的分布式系统.专注于实时处理的异步任务队列.同时也支持任务调度. Celery的架构由三部分组成,消息中间件(message ...

  4. MySQL序列解决方案

    MySQL序列解决方案 MySQLOracleSQL  MySQL自增长与Oracle序列的区别: 自增长只能用于表中的其中一个字段 自增长只能被分配给固定表的固定的某一字段,不能被多个表共用. 自增 ...

  5. zabbix agent的主动工作模式实战案例

    zabbix agent的主动工作模式实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.zabbix agent的工作模式概述 zabbix agent的主动工作模式: ...

  6. InnoDB 和 MyISAM的索引区别

    MyISAM索引实现 MyISAM索引文件和数据文件是分离的,索引文件的data域保存记录所在页的地址(物理存储位置),通过这些地址来读取页,进而读取被索引的行数据. MyISAM的索引原理图如下,C ...

  7. ArrayList和LinkedList、Vector的优缺点?

    一般在面试中可能会被问到ArrayList.LinkedList.Vector三者相关的区别! 一般来说我想大概都会回答如下的这些: ArrayList底层是数组结构,查询快,增删慢,线程不安全,效率 ...

  8. mysql批量插入更新操作

    //添加关联赠品(确定) public function addGiveGoods($ids,$child,$parent_sku_no){ $license=new LicenseModel(); ...

  9. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-cloud

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  10. P1042 字符统计

    P1042 字符统计 转跳点: