Java反射机制


  • 反射机制定义

反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许其对内部成员进行操作。由于反射机制能够实现在运行时对类进行装载,因此能够增加程序的灵活性,但是不恰当地使用反射机制,也会严重影响系统的性能。具体而言,反射机制的主要功能主要有:①得到一个对象所属的类,②获取一个类的所有成员变量和方法,③在运行时创建对象,调用对象的方法。

  • 反射机制的实现

反射机制获取类的方法有三种,我们分别展示如何获取Reflection包下的Student类

  1. Class.forName("类的路径")         Class Student = Class.forName("Reflection.Student");    //包名+类名
  2. 类名.class                                Class Student = Reflection.Student.class;
  3. 类实例.getClass()                      Student student = new Student();    Class Student = student.getClass();

Class类中的6个重要方法

  1. getName()方法,返回一个String字符串,显示该类的名称。

    • System.out.println(Student.getName());       //输出: Reflection.Student
  2. newInstance()方法, 由类调用该方法,根据该类的默认构造函数创建类的实例
    • Object o = Student.newInstance();
  3. getClassLoader()方法,返回该类对象的对应的加载器。
  4. getComponentType()方法,返回类的组件类型的数组,如果这个类并不代表一个数组类,此方法返回null。
  5. getSuperClass()方法,返回某子类所对应的直接父类所对应的Class对象。
  6. isArray()方法,判定此Class对象所对应的是否是一个数组对象。
  • 反射机制获取类的属性(所有属性和指定属性)

    • 获取所有属性
public class Test {
public static void main(String[] args) {
//Class Student = Class.forName("Reflection.Student"); //包名+类名
Class Student = Student.class;
Field[] fs = Student.getDeclaredFields();
for(Field field : fs){
System.out.print(field.getModifiers() + " "); ////获得属性的修饰符,例如public,static等等,结果为int型
System.out.print(field.getType().getSimpleName() + " "); //获取属性类型的名称
System.out.println(field.getName());
}
}
}
class Student {
public String name;
private int id;
public double score;
public static String SCHOOLNAME = "Beijing University of Post and Telecommunications";
public void printName(){
System.out.println(name);
}
public void setID(int ID){
this.id = ID;
}
public static void print(){
System.out.println("This is a Student class");
}
}
输出结果如下:

1 String name
2 int id
1 double score
9 String SCHOOLNAME

    • 获取指定属性
public static void main(String[] args) {
//Class Student = Class.forName("Reflection.Student"); //包名+类名
Class Student = Student.class;
try {
Field fs = Student.getDeclaredField("id");
Object o = Student.newInstance();
fs.setAccessible(true); //Student对象的id属性为private,只有设置为true才允许在外部直接修改属性值
fs.set(o, 2018111546);
System.out.println(fs.get(o));
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
输出结果:
2018111546
  • 反射机制获取类的方法

    • 获取类的构造方法

      • getDeclaredConstructors()                            //获取类的所有构造方法
      • getDeclaredConstructor(参数类型.class,……)     //获取特定的构造方法
public class Test {
public static void main(String[] args) {
//Class Student = Class.forName("Reflection.Student"); //包名+类名
Class Student = Student.class;
Constructor[] con = Student.getConstructors();
for(Constructor c : con)
System.out.println(c.toString());
Constructor c = Student.getConstructor(String.class, int.class, double.class);
System.out.println(c.toString());
}
}
class Student {
public String name;
private int id;
public double score;
public static String SCHOOLNAME = "Beijing University of Post and Telecommunications";
public Student(){
name = "zhangsan";
id = 2018111846;
score = 86;
}
public Student(String name, int id, double score){
this.name = name;
this.id = id;
this.score = score;
}
public void printName(){
System.out.println(name);
}
public void setID(int ID){
this.id = ID;
}
public static void print(){
System.out.println("This is a Student class");
}
}
输出结果

public Reflection.Student()
public Reflection.Student(java.lang.String,int,double)

public Reflection.Student(java.lang.String,int,double)

    • 获取类的普通方法

      • getDeclaredMethods()                                        //获取所有普通方法
      • getDeclaredMethod("方法名",参数类型.class,……)     //获取指定名称的方法
      • getReturnType()                                               //获取方法的返回类型
      • getParameterTypes()                                         //获得方法的传入参数类型
public static void main(String[] args) {
//Class Student = Class.forName("Reflection.Student"); //包名+类名
Class Student = Student.class;
Method[] mds = Student.getMethods();
for(Method m : mds){
System.out.println(m.getReturnType());
Class[] classs = m.getParameterTypes();
for(Class s : classs)
System.out.println(s.getName());
}
}
输出结果:
void
void
void
int
void
void
long
int
void
long
int
class java.lang.Class
boolean
java.lang.Object
class java.lang.String
void
void 

Java中的反射机制的更多相关文章

  1. java中的反射机制在Android开发中的用处

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...

  2. 浅说Java中的反射机制(二)

    写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...

  3. 浅说Java中的反射机制(一)

    在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...

  4. 【Java基础】java中的反射机制与动态代理

    一.java中的反射机制 java反射的官方定义:在运行状态下,可以获取任意一个类的所有属性和方法,并且可通过某类任意一对象实例调用该类的所有方法.这种动态获取类的信息及动态调用类中方法的功能称为ja ...

  5. java 中利用反射机制获取和设置实体类的属性值

    摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...

  6. Java 中的反射机制

    JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为ja ...

  7. 深入理解Java中的反射机制

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...

  8. Java中的反射机制和动态代理

    一.反射概述 反射机制指的是Java在运行时候有一种自观的能力,能够了解自身的情况为下一步做准备,其想表达的意思就是:在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法:对于任意一个对象 ...

  9. Java中的反射机制Reflection

    目录 什么是反射? 获取.class字节码文件对象 获取该.class字节码文件对象的详细信息 通过反射机制执行函数 反射链 反射机制是java的一个非常重要的机制,一些著名的应用框架都使用了此机制, ...

随机推荐

  1. C++哈夫曼树编码和译码的实现

    一.背景介绍: 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的 ...

  2. Lua游戏时区问题

    关于cocos2dx-lua版本中游戏时间显示问题 2015-04-19 19:07 1466人阅读 评论(0) 收藏 举报  分类: Lua(29)   cocos2d(38)  版权声明:本文为博 ...

  3. Tempdb initial size和dbcc shrinkfile

    在使用sql server时您可能遇到过下面的情况,tempdb的数据文件初始大小为3mb, 随着对tempdb的使用,tempdb文件逐渐变得很大(例如30GB),导致了磁盘空间不足. 此时您需要立 ...

  4. UI控件(UIButton)

    @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // UIButtonTypeCustom = 0, ...

  5. 全新 Mac 安装指南(通用篇)(推荐设置、软件安装、推荐软件)

    注:本文将会不定期维护与更新,有需要的朋友请在 Github 上订阅该条 Issues:<全新 Mac 安装指南(通用篇)>. 在 Mac 电脑上只用 Windows 操作系统的同学请看到 ...

  6. A*寻路算法

    对于初学者而言,A*寻路已经是个比较复杂的算法了,为了便于理解,本文降低了A*算法的难度,规定只能横竖(四方向)寻路,而无法直接走对角线,使得整个算法更好理解. 简而言之,A*寻路就是计算从起点经过该 ...

  7. MySQL COLUMNS分区

    200 ? "200px" : this.width)!important;} --> 介绍 COLUMN分区是5.5开始引入的分区功能,只有RANGE COLUMN和LIS ...

  8. Alljoyn之管中窥豹

    Alljoyn之管中窥豹 一.历史: Alljoyn是高通2011年推出的近距离P2P通讯技术,它为分布式应用程序在不同设备中提供了运行环境,特别是移动性.安全性和动态配置,支持Microsoft W ...

  9. 每天一个linux命令(48):watch命令

    watch是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样,watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行.在Linux下,watch是周期性的执行下个 ...

  10. VS2012 VS2015 的项目配置模板及其目录

    建立的项目多了的时候 , 就希望能自己配置好一个项目模板,以后建立的项目自动使用这个模板就省事了,不用每次都要改, 每个项目都要改了! 经不懈努力, 终于 发现了 vs2015,vs2012 (我只用 ...