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. maven更新JRE更改JSE1.5

    1. [代码]在maven的配置文件settings.xml中的<profiles>标签里添加如下代码,设置默认JRE编译版本为1.7 <profile> <id> ...

  2. Linux CentOS7 VMware 文件和目录权限chmod、更改所有者和所属组chown、umask、隐藏权限lsattr/chattr

    一.文件和目录权限chmod u User,即文件或目录的拥有者:g Group,即文件或目录的所属群组:o Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围:a All,即全部 ...

  3. Java面向对象之类、接口、多态

    Java面向对象之类.接口.多态 类 class Person { // 实例属性 int age; String name; // 类属性 static int v = 1; // 构造器 publ ...

  4. SQL SERVER查询数据库所有的表名/字段

    SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='subject' --表名 1.利用sysobjects系统表 在这个表中,在数据 ...

  5. C# FTp 上传,下载

    public class FtpHelper { string ftpServerIP; string ftpRemotePath; string ftpUserID; string ftpPassw ...

  6. 白手起家Django项目发布中篇_Centos下Python2和3并存环境部署

    python环境部署 我们今天学习的内容是如何将Django项目部署到linux服务器上,我们部署的linux系统是centos7首先,我们先在linux上搭建我们的Python3环境: 在这里首先强 ...

  7. java多条件查询SQL语句拼接的小技巧

    问题: 一个界面有个多个文本框输入值(或下拉框)展示的查询条件,也就是组合条件查询,需要在java里面动态拼接SQL,where条件如何写? 解决思路: 在where关键字后面固定写 1=1, 若还有 ...

  8. 链表题目汇总(python3)

    1.从头到尾打印链表 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. # -*- coding:utf-8 -*- class ListNode: def __init__(self ...

  9. 012-PHP创建一个多维数组

    <?php $Cities = array( //二维数组array() "华北地区"=>array( "北京市", "天津市" ...

  10. NIO 与 零拷贝

    零拷贝介绍 零拷贝是网络编程的关键, 很多性能优化都需要零拷贝. 在 Java程序中, 常用的零拷贝方式有m(memory)map[内存映射] 和 sendFile.它们在OS中又是怎样的设计? NI ...