1.反射机制概述

java能够反射的前提:已经加载过这个类
反射可以通过类名来寻找这个类的所有相关信息、类似于人类的记忆,事先在记忆中有了这个事物的信息,人就可以通过名字来在记忆中寻找事物的具体信息。

Reflection(反射)
是被视为动态语言的关键,反射机制允许程序在执行期借助Reflection API取得任何类的内部信息并能直接操作任意对象的内部属性及方法。

java反射机制所提供的功能
生成动态代理
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判断任意一个类所具有的成员变量和方法
在运行时调用任意一个对象的成员变量和方法生成动态代理

java反射机制的研究及应用
反射相关的主要API:

java.lang.Class:代表一个类
java.lang.reflect.Method:代表类的方法
java.lang.reflect.Field:代表类的成员变量
java.lang.reflect.Constructor:代表类的构造方法

2.Class类

Class类可以对任意的类进行高度抽象,能够描述所有的类
在Object类中定义了以下的方法,此方法将被所有子类继承:
public final Class getClass()
以上方法返回值类型就是一个Class类,此类事java反射的源头,实际上所谓反射从程序运行结果来看也很好理解,即:可以通过对象反射求出类的名称

    1.Class c0=Person.class;  通过类名.Class可以创建指定类的class实例(Person是类名)2.Class c1=p.getClass(); 通过一个类的实例对象.getClass()方法,获取对应实例对象的类的Class实例Class clazz = p.getClass(); Class对象中就包含对象P所属的Person类的所有信息3.通过Class的静态方法forName(String className)来获取class实例,*这个是获取class实例的常用方法*forName(String className)方法中的参数是你要获取的class实例的类的全路径(包名.类名)try {Class c2=Class.forName("fanshe.Person");} catch (Exception e) {e.printStackTrace();}注意:Class c2=Class.forName("fanshe.Person")语句存在异常,需要捕获异常

3.1反射获取一个子类的父类和接口

代码演示:*

public class Test1 {public static void main(String[] args) {try {//通过包名,类名的字符串,调用class.forName方法获取指定类的实例Class clazz= Class.forName("fanshe.Student");Class superClazz= clazz.getSuperclass();//获取父类System.out.println("父类"+superClazz.getName());Class interfaces[]=clazz.getInterfaces();//获取当前类的所有接口for(Class c:interfaces){System.out.println("接口"+c.getName());}} catch (ClassNotFoundException e) {e.printStackTrace();}}
}运行结果:
父类fanshe.Person
接口fanshe.Move
接口fanshe.Study

3.2反射获取构造方法

public class Test1 {public static void main(String[] args) {try {Class clazz= Class.forName("fanshe.Student");Constructor cons[]=clazz.getConstructors();//构造方法的一个数组//getConstructors获取到类的公有的构造方法for(Constructor c:cons){System.out.println("构造方法名称"+c.getName()+"的修饰符是"+c.getModifiers());//获取方法名称//getModifiers取得方法的修饰符,返回数字1代表public返回数字2代表private}Constructor cons1[]=clazz.getDeclaredConstructors();//获取类的所有构造方法,包括公有和私有的for(Constructor c:cons1){System.out.println("构造方法名称"+c.getName()+"的修饰符是"+c.getModifiers());}} catch (ClassNotFoundException e) {e.printStackTrace();}}
}运行结果:
构造方法名称fanshe.Student的修饰符是1
构造方法名称fanshe.Student的修饰符是1
构造方法名称fanshe.Student的修饰符是2
构造方法名称fanshe.Student的修饰符是1
构造方法名称fanshe.Student的修饰符是1
``Class clazz= Class.forName("fanshe.Student");Constructor cons[]=clazz.getConstructors();for(Constructor c:cons){System.out.println("构造方法名称"+c.getName()+"的修饰符是"+c.getModifiers());//构造方法的参数类型Class paramClazz[]=c.getParameterTypes();for(Class pc: paramClazz){System.out.println("构造方法"+c.getName()+"的参数类型"+pc.getName());}}运行结果:
构造方法名称fanshe.Student的修饰符是1
构造方法fanshe.Student的参数类型java.lang.String
构造方法名称fanshe.Student的修饰符是1

3.3通过反射创建一个对象

import java.lang.reflect.Constructor;
import java.lang.reflect.Parameterpublic class Test1 {public static void main(String[] args) {try {Class clazz=Class.forName("fanshe.Student");//clazz.newInstance()相当于调用Student类的无参公有构造方法,返回的是Object对象Object obj=clazz.newInstance();//强制类型转换Student stu=(Student)obj;System.out.println(stu.school);//指定获取有一个参数并且为String类型的公有的构造方法Constructor c=clazz.getConstructor(String.class);//通过newInstace实例化对象,相当于调用调用的是public Student(String school)方法Student stu1=(Student)c.newInstance("圣芙蕾雅学园");System.out.println(stu1.school);/*通过反射机制可以强制调用私有的构造方法*///指定获取有二个参数的构造方法Constructor c1=clazz.getDeclaredConstructor(String.class,int.class);c1.setAccessible(true);//解除封装,下面可以对私有方法强制调用Student stu2=(Student)c1.newInstance("TeRiRi",14);} catch (Exception e) {e.printStackTrace();}}
}运行结果:
调用的是public Student()
null
调用的是public Student(String school)
圣芙蕾雅学园
调用的是private Student(String name,int age)

3.4反射机制获取类的方法

study类中的方法

test类

package fanshe;import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;public class Test1 {public static void main(String[] args) {try {Class clazz=Class.forName("fanshe.Student");//获取到类的所有公有方法Method ms[]=clazz.getMethods();//获取类的所有方法包括公有私有/* Method ms[]=clazz.getDeclaredMethods();*/for(Method m:ms){System.out.println("方法名"+m.getName());System.out.println("返回值类型"+m.getReturnType());System.out.println("修饰符"+m.getModifiers());Class pcs[]= m.getParameterTypes();//获取方法的参数类型,方法有几个参数数组就有几个元素if(pcs!=null&&pcs.length>0){for(Class pc:pcs){System.out.println("参数类型"+pc.getName());}}System.out.println("--------------------------");}} catch (Exception e) {e.printStackTrace();}}
}运行结果:
方法名showInfo
返回值类型void
修饰符1
--------------------------
方法名studyInfo
返回值类型void
修饰符1
--------------------------
方法名movetype
返回值类型void
修饰符1
--------------------------
方法名wait
返回值类型void
修饰符273
参数类型long
--------------------------
......

3.5反射机制获取类的属性和包


public class Test1 {public static void main(String[] args) {try {Class clazz=Class.forName("fanshe.Student");Field fs[]=clazz.getFields();//获取类的公有属性,包含父类的公有属性/*Field fs[]=clazz.getDeclaredFields();//获取本类所有的属性,包括私有*/for(Field f:fs){System.out.println("修饰符"+f.getModifiers());System.out.println("属性的类型"+f.getType());System.out.println("属性的名称"+f.getName());}Package p=clazz.getPackage();//获取类所在的包System.out.println(p.getName());} catch (Exception e) {e.printStackTrace();}}
}运行结果:
修饰符1
属性的类型class java.lang.String
属性的名称name
fanshe

3.6反射机制调用指定方法

public class Test1 {public static void main(String[] args) {try {Class clazz=Class.forName("fanshe.Student");/*注意:下面无论是反射调用setInfo还是test方法都调用的是obj对象费方法,obj对象实际上是Student对象*/Constructor con=clazz.getConstructor();//获取无参构造Object obj=con.newInstance();//使用无参构造创建对象//得到名称叫setInfo,参数是String,String的公有方法Method m=clazz.getMethod("setInfo",String.class,String.class);//使用m.invoke();调用指定方法m.invoke(obj,"kiana","圣芙蕾雅学园");//参数1是需要实例化的对象,后面的参数是调用当前方法的实际参数//如果想要调用一个私有方法,需要解除封装Method m1=clazz.getDeclaredMethod("test",String.class);//获取方法名为test,参数为1个String类型的方法m1.setAccessible(true);//解除封装可以强制调用私有方法m1.invoke(obj,"TeRiRi");//调用一个重载方法Method m2=clazz.getMethod("setInfo",int.class);//重载方法m2.invoke(obj,14);//有返回值的方法Method m3=clazz.getMethod("getSchool");//获取方法名为getSchool并且没有方法String school=(String)m3.invoke(obj);//调用没有有回值但是没有参数的方法System.out.println(school);} catch (Exception e) {e.printStackTrace();}}
}运行结果:
调用的是public Student()
这是个setInfo(String name,String school)方法
这是私有方法
这是setInfo(int age)方法
圣芙蕾雅学园

3.7调用指定属性

public class Test1 {public static void main(String[] args) {try {Class clazz=Class.forName("fanshe.Student");//反射创建一个对象Constructor con=clazz.getConstructor();Student stu=(Student)con.newInstance();/*等效于Object obj=con.newInstance();Student stu=(Student)obj;*/Field f=clazz.getField("school");//获取名称为school的属性f.set(stu,"圣芙蕾雅学园");//对stu对象的school属性设置值,“圣芙蕾雅学园”String school=(String)f.get(stu);//获取stu对象的school属性值,返回值类型为ObjectSystem.out.println(school);//如果是私有属性Field f1=clazz.getDeclaredField("privateField");f1.setAccessible(true);f1.set(stu,"测试私有属性");System.out.println(f1.get(stu));} catch (Exception e) {e.printStackTrace();}}
}运行结果:
调用的是public Student()
圣芙蕾雅学园
测试私有属性

java 反射Reflection;Class类相关推荐

  1. java 反射获取实体类_Java 通过反射给实体类赋值操作

    表单提交这个方法是挺方便的,但在java来说就显得有些麻烦了, 怎么个麻烦呢,就是当你字段多的时候,你就得一个一个的获取其对应的值,这样代码量就多了起来,其代码量不说,维护也是一个问题. 所以就有了这 ...

  2. 利用Java反射机制调用类的私有方法

    利用Java反射机制调用类的私有方法 引言 来吧·展示 参考链接 引言 如何调用其他类的私有方法呢? 可以利用Java的反射机制,去调用其他类的私有方法 来吧·展示 package cn.learn. ...

  3. java反射获取方法内部_公共技术点之 Java 反射 Reflection

    本文为 Android 开源项目源码解析 公共技术点中的 Java 反射 部分 分析者:Mr.Simple,校对者:Trinea,校对状态:未完成 1. 了解 Java 中的反射 1.1 什么是 Ja ...

  4. 公共技术点之 Java 反射 Reflection

    1. 了解 Java 中的反射 1.1 什么是 Java 的反射 Java 反射是可以让我们在运行时获取类的函数.属性.父类.接口等 Class 内部信息的机制.通过反射还可以让我们在运行期实例化对象 ...

  5. java反射获取实体类_java 反射获取类对象的三种方式

    Java反射经常用到的就是获取对象中的属性,那么Java获取类对象就是必不可少的啦! Java实体类: public class ReflexModel { private String code; ...

  6. JAVA反射和CLASS类

    感谢原文作者:http://blog.sina.com.cn/s/blog_62a6ceb10100gwe0.html JAVA其实不算是一门动态语言,但JAVA中却又一种机制可以达到动态的某中效果, ...

  7. Java反射之Filed(类中的属性对象)

    通过反射机制获取类中的属性对象. 1.获取类中所有的public属性(包括父类):getFields(): public class TestFiled {class A{public int age ...

  8. 超详细的逐句介绍Java反射之Field类和InvocationTargetException类函数源码讲解(全)

    一.Field类和InvocationTargetException类 InvocationTargetException 是一个经过检查的异常,它包装了被调用的方法或构造函数抛出的异常.Field提 ...

  9. java反射的工具类的函数集合

    import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang ...

最新文章

  1. linux gotoxy(int x, int y)
  2. 2020年快手校招JAVA岗笔试第二题
  3. 微信小程序-路由方式
  4. html导航栏点击不能跳转,无法单击导航栏中的链接CSS HTML
  5. 一站式实时数仓开发:当FLINK SQL遇见ULTRON
  6. 服务器端性能优化之CDN
  7. JS getElementsByClassName
  8. 神策分析 iOS SDK 架构解析
  9. python 键盘输入立刻反应_win10系统,为什么键盘输入字符后得停顿一下,鼠标点击才有效 例如在wor...
  10. ios设置阴历或农历生日(以iPhone X为例)
  11. BOM对非标制造企业成本管控的重要性
  12. 华为运营商级路由器配置示例 | 公网IPv4 over SRv6 TE Policy
  13. 环洋市场调研-2022年全球一次性餐具市场总体规模及应用细分研究报告
  14. 升级笔记本CPU的常见知识汇总
  15. 如何让 PPT 中的表格更美观?
  16. 公司章程违反了公司法该怎么办
  17. python 梯度下降法实现一元线性回归
  18. 【Head First 设计模式】观察者模式
  19. 在Deepin Linux折腾出来Fuji xerox DocuPrint M115b 打印机驱动
  20. Python实现经典机器学习案例 良/恶性性乳腺癌肿瘤预测

热门文章

  1. 弹性盒子(flex) 改变主轴和强制换行
  2. P10对比S8:三星S8拍摄功底难敌华为P10徕卡双摄
  3. wrs-jpush极光推送原生app插件
  4. URL短链接压缩算法 微博短链接原理解析
  5. 祝大家2018事业有事,大吉大利!
  6. 让CoFlash支持国产CH32f103c8t6
  7. Android使用Retrofit技术仿微信图片上传,可以选择多张图片拍照上传
  8. ArcGIS计算矢量线长度
  9. 肠道微生物群可以导致自闭、多动、焦虑和抑郁
  10. WIN10-Python-pclpy离线安装步骤