反射机制是Java动态性之一,而说到动态性首先得了解动态语言。那么何为动态语言?
一、动态语言
动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化。比如常见的JavaScript就是动态语言,除此之外Ruby,Python等也属于动态语言,而C、C++则不属于动态语言。
二、Java是动态语言吗?
三、反射机制:
1.反射机制概念
在Java中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能成为Java语言的反射机制。
2.反射的应用场合
在Java程序中许多对象在运行是都会出现两种类型:编译时类型和运行时类型。
编译时的类型由声明对象时实用的类型来决定,运行时的类型由实际赋值给对象的类型决定
如:
Person p=new Student();
四、Java反射API
五、使用反射的步骤
1.步骤
- 获取想要操作的类的Class对象
- 调用Class类中的方法
- 使用反射API来操作这些信息
2.获取Class对象的方法
- 调用某个对象的getClass()方法
Person p=new Person(); Class clazz=p.getClass();
- 调用某个类的class属性来获取该类对应的Class对象
Class clazz=Person.class;
- 使用Class类中的forName()静态方法; (最安全/性能最好)
Class clazz=Class.forName("类的全路径"); (最常用)
3.获取方法和属性信息
<<<<<<<<<<<<<<<<<<<<<
public
class Person {
private String name;
private String gender;
private
int age;
public
Person() { }
public
Person(String name, String gender,
int age) {
this.name = name;
this.gender = gender;
this.age = age; }
//getter和setter方法
public String
getName() {
return name; }
public
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+
" 性别:"+gender+
" 年龄:"+age; } }
<<<<<<<<<<<<<<<
<使用反射<<<<<<<<<<<<<<<<<<< package="" reflection
; import java
.lang
.reflect
.Constructor
; import java
.lang
.reflect
.Field
; import java
.lang
.reflect
.Method
;
/* * 通过用户输入类的全路径,来获取该类的成员方法和属性 * Declared获取全部不管是私有和公有 * 1.获取访问类的Class对象 * 2.调用Class对象的方法返回访问类的方法和属性信息 */ public class Test { public static void main(String[] args) { try { //获取Person类的Class对象 Class clazz=Class
.forName(
"reflection.Person")
; //获取Person类的所有方法信息 Method[] method=clazz
.getDeclaredMethods()
; for(Method m:method){ System
.out
.println(m
.toString())
; } //获取Person类的所有成员属性信息 Field[] field=clazz
.getDeclaredFields()
; for(Field f:field){ System
.out
.println(f
.toString())
; } //获取Person类的所有构造方法信息 Constructor[] constructor=clazz
.getDeclaredConstructors()
; for(Constructor c:constructor){ System
.out
.println(c
.toString())
; } } catch (Exception e) { e
.printStackTrace()
; } } }
使用反射<<<<<<<<<<<<<<<<<<<>
输出结果:
方法信息:
public java.lang.String reflection.Person.toString()
private java.lang.String reflection.Person.getName()
private void reflection.Person.setName(java.lang.String)
public void reflection.Person.setAge(int)
public int reflection.Person.getAge()
public java.lang.String reflection.Person.getGender()
public void reflection.Person.setGender(java.lang.String)
属性信息:
private java.lang.String reflection.Person.name
private java.lang.String reflection.Person.gender
private int reflection.Person.age
构造方法信息
private reflection.Person()
public reflection.Person(java.lang.String,java.lang.String,int)
4.创建对象
当我们获取到所需类的Class对象后,可以用它来创建对象,创建对象的方法有两种:
- 使用Class对象的newInstance()方法来创建该Class对象对应类的实例,但是这种方法要求该Class对象对应的类有默认的空构造器。
- 先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建 Class对象对应类的实例,通过这种方法可以选定构造方法创建实例。
示例代码:
package reflection; import java.lang.reflect.Constructor; public class Demo01 {
public static void main(String[] args) { try { //获取Person类的Class对象 Class clazz=Class.forName("reflection.Person"); / * 第一种方法创建对象 */ //创建对象 Person p=(Person) clazz.newInstance(); //设置属性 p.setName("张三"); p.setAge(16); p.setGender("男"); System.out.println(p.toString()); / * 第二种方法创建 */ //获取构造方法 Constructor c=clazz.getDeclaredConstructor(String.class,String.class,int.class); //创建对象并设置属性 Person p1=(Person) c.newInstance("李四","男",20); System.out.println(p1.toString()); } catch (Exception e) { e.printStackTrace(); } } }
输出结果:
好了,以上是Java反射机制的简单介绍,下一篇文章我将讲一下反射的两个具体应用,通过反射操作注解和通过反射操作泛型,有兴趣的同学可以了解一波。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225255.html原文链接:https://javaforall.net
