(一)Class对象获取类名,包名,父类,接口

前提条件:
有两个接口IMessage,SystemEdition
一个父类Father
一个子类Son继承父类,实现两个接口IMessage,SystemEdition

package www.fanfaninterface IMessage{}interface SystemEdition{}
class Father{}class Son extends Father implements IMessage,SystemEdition{}
  1. Class对象获取 本类信息 与 本类全限定类名
        Class sonClass = Son.class;System.out.println(sonClass);//获取本类信息System.out.println(sonClass.getName());//获取本类全限定名
  1. Class对象获取 包的信息 与 包的全限定名
       //获取包Package packages = sonClass.getPackage();System.out.println(packages);//获取包的信息System.out.println(packages.getName());//获取报的权限顶名称
  1. Class对象获取 父类信息 与 父类全限定类名 与 类名
    如果没有继承任何父类,则父类默认为Object类
        //获取父类Class superClass = sonClass.getSuperclass();System.out.println(sonClass);//弗雷信息System.out.println(sonClass.getName());//父类全限定名System.out.println(sonClass.getSimpleName());//父类名
  1. Class对象获取接口信息 与 接口全限定名
    如果该类没有实现接口,则返回空数组
        Class[] interfaceClass = sonClass.getInterfaces();for (Class i:interfaceClass){System.out.println(i);//接口的信息System.out.println(i.getName());//接口的全限定名}

(二)反射调用构造方法

Class类通过反射实例化类对象的时候,只能够调用类中的无参构造。如果现在类中没有无参构造则无法使用Class类调用,只能够通过明确的构造调用实例化处理。

  1. 获取所有的构造方法;
  2. 获取某一个构造方法。

前提:
有一个Person类,里面有不同参数的构造方法

package www.fanfan;
class Person{private String name;private Integer age;public Person() {}public Person(String name) {this.name = name;}public Person(String name, Integer age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}

(1)创建Person类的Class对象

Class personClass = Person.class;

(2)调用所有的构造方法
所有的构造方法肯定用数组存放。

//获取Person类所有的构造方法
Constructor[] constructors =  personClass.getConstructors();
//打印每一个构造方法全限定名和参数类型
for (Constructor i:constructors){System.out.println(i.getName()+"("+ Arrays.toString(i.getParameterTypes())+")");}


(3)调用某一个构造方法
在获取某一个构造方法的时候,要注意标明其参数类型

Constructor c = personClass.getConstructor(String.class);//参数类型
Object obj = c.newInstance("alice");
System.out.println(obj.getClass().getName());
System.out.println(obj);

(三)反射调用普通方法

(1)取得全部普通方法;
(2)取得某个普通方法;
(3)调用。
具体使用方法如下:
前提:有一个Person类,与上面的Person类完全一样。
(1)创建一个Class对象。

 Person person = new Person("jack",20);Class personClass = person.getClass();

(2)反射调用Person类中的全部方法。
全部方法肯定用数组存放。

//获取所有的普通方法
Method[] methods = personClass.getMethods();
//打印数组中的普通方法
System.out.println("Person类中所有方法。");for (Method i:methods){System.out.println(i.getName()+"("+Arrays.toString(i.getParameterTypes())+")");}

(3)反射调用Person类中的某一方法

1)调用普通方法之前一定要有实例化对象;
2)取得所调用方法的实例化对象,并且设置方法名称和参数类型;
3)通过Method类对象调用指定的方法,并且传入参数。

此处为调用setter,getter方法。

//取得setName方法的实例化对象,并且设置方法名称和参数类型
Method setNameMethod = personClass.getMethod("setName",String.class);
//通过setName方法的实例化对象,调用指定方法并且传入参数。
setNameMethod.invoke(person,"张三");//调用getName方法,类似
Method getNameMethod = personClass.getMethod("getName");
System.out.println(getNameMethod.invoke(person));

(四)反射调用属性

  1. 使用反射调用类中属性之前必须有类的实例化对象;
  2. 可以获取的属性:
    1)通过getFields()获取弗雷全部属性;
    2)通过getField(…)获取父类某一属性;
    3)通过getDeclaredFields()获取本类全部属性;
    4)通过getDeclaredMethod(…)获取本类某一属性。
  3. 在java.lang.reflect.Field下有两个重要方法“
    1)set:设置属性内容;
    2)get:取得属性内容。
  4. 取得属性类型getType()

具体使用如下:
前提,有两个类,一个Animal父类,一个Dog子类

class Animal{public String name;public Integer age;
}
class Dog extends Animal{private Integer weight;
}

(1)创建Dog类的对象和Class的对象

        Dog dog = new Dog();Class classDog = dog.getClass();

(2)获取父类的全部属性

        Field[] fields1 = classDog.getFields();for (Field f:fields1){System.out.println(f);}

(3)获取本类的全部属性

        Field[] fields2 = classDog.getDeclaredFields();for (Field f:fields2){System.out.println(f);}

(4)获取本类的某一个方法
使用set()方法设置其属性值;
使用 get()获得其属性值;
使用getType()方法获得属性的类型。

            Field field = classDog.getField("name");field.set(dog,"小狗");System.out.println(field.get(dog));System.out.println(field.getType().getName());System.out.println(field.getType().getSimpleName());

java—使用反射对类进行操作(Class对象获取类名,包名,父类,接口,构造方法,普通方法,属性)相关推荐

  1. java中反射机制通过字节码文件对象获取字段和函数的方法

    pclass = Class.forName("get_class_method.Person");//Field ageField = pclass.getField(" ...

  2. Java的反射机制 —— 类的镜子

    Java的反射机制 -- 类的镜子 文章目录 Java的反射机制 -- 类的镜子 一.反射机制的原理 1.1.什么是反射? 1.2.反射机制的实现 1.3.获取类的Class对象的途径 1.4.运行时 ...

  3. java是先有类还是先有对象_Java中关于先有鸡还是先有蛋的问题----ClassObject

    在Java中,我们常常会看到一个类型:Class.并且在类似Person.class,cache.getClass()等代码中见到它的身影. 众所周知,Class是用来描述一个类的类型,而Object ...

  4. php定义一个学生类_3分钟短文 | PHP获取函数参数名,和类定义的常量,都要反射...

    引言 本文我们分享两个知识点,算是PHP编程中的稍微高阶一点的用法,一般不会用到.可是有了这个思路之后,你对于自己的冗余代码,应该会有想法了. 获取函数形参列表 我们在写程序的时候,不可能所有功能逻辑 ...

  5. Java面向对象思想、类的定义、对象的使用、对象内存图、成员变量和局部变量的区别、封装、private关键字、this关键字、构造方法、JavaBean-day06

    目录 第1节 面向对象思想 1.1 面向对象思想概述 概述 举例 特点 1.2 类和对象 什么是对象 类与对象的关系 1.3 类的定义 事物与类的对比 类的定义格式 1.4 对象的使用 对象的使用格式 ...

  6. 【Java 进阶】匿名类(代码传递、回调、过滤器)、Lambda表达式(方法引用)、函数式接口(Supplier、Consumer、Predicate、Function)

    匿名类 匿名类(Anonymous Class) 匿名类的使用注意 匿名类 - 代码传递 - 测试代码运行时间的工具类 匿名类 - 回调 - 简易网络请求 匿名类 - 过滤器 - 获取目录下的所有文件 ...

  7. 【java笔记】File类(2):获取,判断,创建,删除,遍历目录方法

    [java笔记]File类(1)概述,静态成员,构造方法_m0_52043808的博客-CSDN博客 获取功能方法: public String getAbsolutePath():返回此File的绝 ...

  8. java中什么是类?什么是对象?

    首先什么是对象呢?可谓是万物皆对象,对象是客观存在的事物,可以说任何客观存在的都是可以成为对象,一台电脑,一直钢笔,一个人,一辆轿车等等,都是可以成为对象. 那么什么是类呢?类是对象的模子,具有相同属 ...

  9. JAVA实验二:设计一个教师类Teacher(属于cn.net.sdkd包)实现接口进行排序等

    设计一个教师类Teacher(属于cn.net.sdkd包) (1)属性有编号(int no).姓名(String name).年龄(int age).所属学院(String seminary),为这 ...

最新文章

  1. AngularJs $resource 高大上的数据交互
  2. haproxy,lvs keepalived || heartbeat,nginx对比
  3. 做向量召回 All You Need is 双塔
  4. E - Rotate and Flip(线性代数矩阵坐标变换)
  5. NAT与DHCP协议
  6. mybatisplus 一次性执行多条SQL语句插入(Oracle篇)
  7. stm32 PWM互补输出
  8. 夯实Java基础(二)——面向对象之封装
  9. FtpWebRequest(转)---关于C/S中文件的上传,下载,获得文件列表
  10. MySQL主从同步(三)——M-S-S架构配置实战
  11. 谷歌电子市场[Google Play]发布应用攻略,强烈推荐!
  12. ipython怎么安装_ipython安装(python3.6.1)(转载)
  13. 机器学习中的数学——点估计(三):极大似然估计/最大似然估计(Maximum Likelihood Estimate,MLE)
  14. 3 - Error writing file 'C:\Windows\TEMP\MY18F3.tmp' (Errcode: 28)
  15. windows10 禁用Device/Credential Guard解决方案
  16. 用MATLAB做周期三角波的傅里叶级数,Matlab 周期方波信号傅里叶级数展开
  17. Docker的基本操作命令
  18. Jessi-记录工作问题
  19. autojs获取id_手把手教你使用AutoJS自动领京豆
  20. 程序员读《马云全转》

热门文章

  1. LAMPDISCUZ论坛
  2. 【数据结构】顺序表(C++)
  3. 集成学习(上)——Task3 考试前千万不要背书
  4. 兄弟连Linux在线课堂:第7讲 Linux用户管理
  5. js中的全局作用域和局部的作用域
  6. CorelDRAW中可以导入的文件格式有哪些
  7. Android主题更换换肤
  8. 北京林业大学2020软件工程/计算机技术/电子信息专硕初试上岸经验
  9. js几种倒计时实现方式
  10. 微信小程序循环列表实现单个显示与隐藏