一、JAVA是动态语言吗?

一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言。

但JAVA它却有着一个非常突出的动态相关机制:反射。通过反射,Java可以于运行时加载、探知和使用编译期间完全求和的类、生成其对象实体,调用其方法或者对属性设值。所以Java算是一个半动态的语言吧。

反射的概念:

在Java中的反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;

对于任意一个对象,都能够调用它的任意一个方法;

这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制

二、动态性质

2.1、动态性质

●运行时生成对象实例;
●运行期间调用方法;
●运行时更改属性

2.2、Java反射机制能实现的功能

●在运行时判断任意一个对象所属的类
●在运行时构造任意一个类的对象
●在运行时判断任意怀个类所具有的方法和属性
●在运行时调用任意一个对象的方法
●生成动态代理

2.3、Java反射应用场合

在Java程序中许多对象在运行时都会出现两种类型:编译时类型和运行时类型

编译时的类型由声明该对象时使用的类型决定,运行时的类型由实际赋给对象的类型决定

如:
Person p =new Student();
编译时类型为Person,而运行时为Student

除此之外,程序在运行时还可能接收到外部传入的一个对象,该对象的编译时类型为Object,但程序又需要调用该对象运行时类型的方法。为了这些问题程序需要在运行时发现对象和类的真实信息。然而,如果编译时根本无法预知该对象和类可能属于哪些类,程序只依靠运行时信息来发现该对象和类的真实信息,此时就必须使用反射

三、Java反射API

反射API用来生成在当前JAVA虚拟机中的类、接口或者对象的信息。

●Class类:反射的核心类,可以获取类的属性,方法等内容信息。

●Field类:Java.lang.reflect.表示类的属性,可以获取和设置类的中属性值。

●Method类:Java.lang.reflect。表示类的方法,它可以用来获取类中方法的信息或者执行方法

Construcor类:Java.lang.reflect。表示类的构造方法。

四、获取全部方法和属性

Person类

package com.pb.Reflect.classinfo;public class Person {
private String name;
private String gender;
private int age;private Person() {
//
}
public Person(String name, String gender, int age) {super();this.name = name;this.gender = gender;this.age = age;
}
//getter、和setter方法
private String getName() {return name;
}
private void setName(String name) {this.name = name;
}
public String getGender() {return gender;
}
public void setGender(String gender) {this.gender = gender;
}
public int getAge() {return age;
}
public void setAge(int age) {this.age = age;
}public String toString(){return "姓名:"+name+"年龄: "+age;
}}
使用反射:
package com.pb.Reflect.classinfo;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;import javax.swing.JOptionPane;/*
* 通过用户输入类的全路径,来获取该类的成员方法和属性
* Declared获取全部不管是私有和公有
* 1.获取访问类的Class对象
* 2.调用Class对象的方法返回访问类的方法和属性信息
*/
public class ReflectDemo {/*
* 构造方法
*/
public ReflectDemo(){//用户输入类的全路径径//使用String组件String classpsth=JOptionPane.showInputDialog(null,"输入类的全路径");//使用Class.forName方法根据输入的类的全路径 返回该类的Class对象try {Class cla = Class.forName(classpsth);//利用Class对象的cla的自审,返回方法对象集合Method [] method=cla.getDeclaredMethods(); //返回所有的方法System.out.println("========获取方法信息============");for (Method meth : method) {//遍历method数组,并输出方法信息System.out.println(meth.toString());}System.out.println("========获取出方法信息结束============");//获取属性利用Class对象的cla的自审,返回成员属性对象集合Field [] field=cla.getDeclaredFields();System.out.println("========获取成员属性信息============");for (Field f : field) {System.out.println(f.toString());}System.out.println("========获取成员属性信息结束============");//获取属性利用Class对象的cla的自审,返回构造方法集合Constructor [] constructor=cla.getDeclaredConstructors();System.out.println("========获取成员构造方法信息============");for (Constructor constru : constructor) {System.out.println(constru.toString());}System.out.println("========获取成员构造方法信息结束============");} catch (ClassNotFoundException e) {e.printStackTrace();System.out.println("路径输入错误!");}
}}
package com.pb.Reflect.classinfo;public class TestReflection {public static void main(String[] args) {ReflectDemo rd=new ReflectDemo();}}
输入com.pb.Reflect.classinfo.Person

结果:

========获取方法信息============
public java.lang.String com.pb.Reflect.classinfo.Person.getGender()
public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String)
public int com.pb.Reflect.classinfo.Person.getAge()
public void com.pb.Reflect.classinfo.Person.setAge(int)
public java.lang.String com.pb.Reflect.classinfo.Person.toString()
private java.lang.String com.pb.Reflect.classinfo.Person.getName()
private void com.pb.Reflect.classinfo.Person.setName(java.lang.String)
========获取出方法信息结束============
========获取成员属性信息============
private java.lang.String com.pb.Reflect.classinfo.Person.name
private java.lang.String com.pb.Reflect.classinfo.Person.gender
private int com.pb.Reflect.classinfo.Person.age
========获取成员属性信息结束============
========获取构造方法信息============
private com.pb.Reflect.classinfo.Person()
public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int)
========获取构造方法信息结束============

五、使用反射的步骤

5.1、步骤

Java.lang.reflect

●获得想操作类的Java.lang.Class对象
●调用Class的方法
●使用反射API来操作这些信息

5.2、获取Class对象方式

调用某个对象的getClass()方法
Person p = new Person();
Class cla=p.getClass();
调用某个类的class属性来获取该类对应的Class对象
Class cls=Person.class;
使用Class类的forName()静态方法
Class cla=Class.forName(“类的全路径”);
六、第二种方式对象的getClass()方法

Person类,因为要声明对象所以将构造方法public

package com.pb.Reflect.classinfo;public class Person {
private String name;
private String gender;
private int age;public Person() {
//
}
public Person(String name, String gender, int age) {super();this.name = name;this.gender = gender;this.age = age;
}
//getter、和setter方法
private String getName() {return name;
}
private void setName(String name) {this.name = name;
}
public String getGender() {return gender;
}
public void setGender(String gender) {this.gender = gender;
}
public int getAge() {return age;
}
public void setAge(int age) {this.age = age;
}public String toString(){return "姓名:"+name+"年龄: "+age;
}}
使用反射:
package com.pb.Reflect.classinfo;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;import javax.swing.JOptionPane;/*
* 通过用户输入类的全路径,来获取该类的成员方法和属性
* Declared获取全部不管是私有和公有
* 1.获取访问类的Class对象
* 2.调用Class对象的方法返回访问类的方法和属性信息
*/public ReflectDemo(Person p){Class cla=p.getClass();//利用Class对象的cla的自审,返回方法对象集合Method [] method=cla.getDeclaredMethods(); //返回所有的方法System.out.println("========获取方法信息============");for (Method meth : method) {//遍历method数组,并输出方法信息System.out.println(meth.toString());}System.out.println("========获取出方法信息结束============");//获取属性利用Class对象的cla的自审,返回成员属性对象集合Field [] field=cla.getDeclaredFields();System.out.println("========获取成员属性信息============");for (Field f : field) {System.out.println(f.toString());}System.out.println("========获取成员属性信息结束============");//获取属性利用Class对象的cla的自审,返回构造方法集合Constructor [] constructor=cla.getDeclaredConstructors();System.out.println("========获取成员构造方法信息============");for (Constructor constru : constructor) {System.out.println(constru.toString());}System.out.println("========获取成员构造方法信息结束============");
}}
测试类
package com.pb.Reflect.classinfo;public class TestReflection {public static void main(String[] args) {Person p=new Person();ReflectDemo rd=new ReflectDemo(p);}}
========获取方法信息============
public java.lang.String com.pb.Reflect.classinfo.Person.getGender()
public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String)
public int com.pb.Reflect.classinfo.Person.getAge()
public void com.pb.Reflect.classinfo.Person.setAge(int)
public java.lang.String com.pb.Reflect.classinfo.Person.toString()
private java.lang.String com.pb.Reflect.classinfo.Person.getName()
private void com.pb.Reflect.classinfo.Person.setName(java.lang.String)
========获取出方法信息结束============
========获取成员属性信息============
private java.lang.String com.pb.Reflect.classinfo.Person.name
private java.lang.String com.pb.Reflect.classinfo.Person.gender
private int com.pb.Reflect.classinfo.Person.age
========获取成员属性信息结束============
========获取成员构造方法信息============
public com.pb.Reflect.classinfo.Person()
public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int)
========获取成员构造方法信息结束============

 

七、第三种方法类的.class属性

Person类同上

测试类:

package com.pb.Reflect.classinfo;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;public class TestReflection {public static void main(String[] args) {/*第二种方法Person p=new Person();ReflectDemo rd=new ReflectDemo(p);
*//** 第三种方式.class属性*/Class cla=Person.class;//利用Class对象的cla的自审,返回方法对象集合Method [] method=cla.getDeclaredMethods(); //返回所有的方法System.out.println("========获取方法信息============");for (Method meth : method) {//遍历method数组,并输出方法信息System.out.println(meth.toString());}System.out.println("========获取出方法信息结束============");//获取属性利用Class对象的cla的自审,返回成员属性对象集合Field [] field=cla.getDeclaredFields();System.out.println("========获取成员属性信息============");for (Field f : field) {System.out.println(f.toString());}System.out.println("========获取成员属性信息结束============");//获取属性利用Class对象的cla的自审,返回构造方法集合Constructor [] constructor=cla.getDeclaredConstructors();System.out.println("========获取成员构造方法信息============");for (Constructor constru : constructor) {System.out.println(constru.toString());}System.out.println("========获取成员构造方法信息结束============");
}}

结果:

同上

========获取方法信息============
public java.lang.String com.pb.Reflect.classinfo.Person.getGender()
public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String)
public int com.pb.Reflect.classinfo.Person.getAge()
public void com.pb.Reflect.classinfo.Person.setAge(int)
public java.lang.String com.pb.Reflect.classinfo.Person.toString()
private java.lang.String com.pb.Reflect.classinfo.Person.getName()
private void com.pb.Reflect.classinfo.Person.setName(java.lang.String)
========获取出方法信息结束============
========获取成员属性信息============
private java.lang.String com.pb.Reflect.classinfo.Person.name
private java.lang.String com.pb.Reflect.classinfo.Person.gender
private int com.pb.Reflect.classinfo.Person.age
========获取成员属性信息结束============
========获取成员构造方法信息============
public com.pb.Reflect.classinfo.Person()
public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int)
========获取成员构造方法信息结束============

  

 

转载于:https://www.cnblogs.com/gxbk629/p/4490728.html

Java反射机制分析指南相关推荐

  1. Java 反射机制分析指南

    一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反 ...

  2. 反射 数据类型_这是一份超全面详细的Java反射机制学习指南

    Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性.很多千锋的学员在面试中都会被问到Java反射机制这个问题,为了帮助大家更好的掌握这个知识点,千锋武汉Java培训小 ...

  3. 工作中用到的java反射机制_(转)JAVA-反射机制的使用

    Java反射机制的实现原理 反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力.通过这种能力可以彻底的了解自身的情况为下一步的动作做准备.下面具体介绍一下java的反射机制.这里你将颠 ...

  4. Java学习之二-Java反射机制

    问题: 在运行时,对一个JAVA类,能否知道属性和方法:能否调用它的任意方法? 答案是可以的,JAVA提供一种反射机制可以实现. 目录 什么是JAVA的反射机制 JDK中提供的Reflection A ...

  5. 谈谈Java反射机制

    写在前面: 什么是java反射机制?我们又为什么要学它? 当程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言.我们认为java并不是动态语言,但是它却有一个非常突出的动态相关机制,俗称:反 ...

  6. java反射机制和junit的使用

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

  7. 一个例子让你了解Java反射机制

    本文来自:blog.csdn.net/ljphhj JAVA反射机制: 通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运 ...

  8. Java 反射机制[Field反射]

    Java 反射机制[Field反射] 1.  反射概念及功能 反射就是把Java类中的各种成分映射成对应的Java类.比如一个Java类中用一个Class类的对象来表示. 一个类中的组成部分分为成员变 ...

  9. java反射机制浅谈

    一.Java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

最新文章

  1. draw_circle_mod预生成交互式圆形
  2. mysql DDL数据定义语言
  3. 判断素数或者求出素数的基本算法 《挑战程序设计竞赛》
  4. 机器视觉系统图像采卡基本概念
  5. [转】TCP 三次握手 四次挥手
  6. CSS cursor 属性-鼠标形状
  7. Node组件——Express简介
  8. 【java笔记】类/接口作为成员变量类型
  9. 工业机器人自动化仿真竞赛 Agile Robotics for Industrial Automation Competition (ARIAC 2021)
  10. 矩阵的迹(Trace)
  11. mysql中selectform_数据库中select...from....where....各表示什么意思
  12. 个人成长语录——我愿永远做一个上进的少年,一个敢于拼搏的人
  13. GNN理论入门和小实践——从卷积讲起
  14. 机器视觉系列(一)——概述
  15. SMIL已经死了! SMIL万岁! SMIL功能替代指南
  16. 校验码 汉明码 CRC码
  17. 肯德基app电脑端自动下单程序
  18. css中单位px、pt、em和rem的区别
  19. Couldn't find preset es2015 relative to directory
  20. Ubuntu 20.04修改ip地址(Netplan)

热门文章

  1. 14 个 Spring MVC 顶级技巧,随时用随时爽,一直用一直爽
  2. 127.0.0.1和0.0.0.0地址的区别
  3. Datawhale来厦大啦!
  4. 深度学习不work?这有一份超全的Debug检查清单
  5. 竞赛大杀器xgboost,波士顿房价预测
  6. 深入浅出统计学(十五)相关与回归及PYTHON实现
  7. 华为诺亚开源首个亿级中文多模态数据集-悟空,填补中文NLP社区一大空白
  8. 空中悬停、翻滚转身、成功着陆,我用强化学习「回收」了SpaceX的火箭
  9. 大厂前实习生被威胁,“关闭开源项目,不然就告你”
  10. 使用bottle进行web开发:get的参数传递,form数据传递等