java反射机制(1)


java反射概述

Java反射( Reflection )是Java非常重要的动态特性,通过使用反射我们不仅可以获取到任何类的
成员方法( Methods)、成员变量( Fields )、构造方法( Constructors )等信息,还可以动态
创建Java类实例、调用任意的类方法、修改任意的类成员变量值等。Java反射机制是Java语言的动态性的重要体现,也是Java的各种框架底层实现的灵魂。

1.什么是类对象

• 类的对象:基于某个类 new 出来的对象,也称为实例对象。
• 类对象:类加载的产物,封装了一个类的所有信息(类名、父类、接口、
属性、方法、构造方法)

2.获取类对象的三种方法

• 通过类的对象,获取类对象
• Student s = new Student();
• Class c = s.getClass();
• 通过类名获取类对象
• Class c = 类名.class;(不算反射)
• 通过静态方法获取类对象
• Class c=Class.forName(“包名.类名”);

3.反射java.lang.Runtime

依靠java.lang.Runtime中的exec方法命令执行。

java反射机制(1)

代码展示:

package com.rayxxx;
import java.lang.reflect.Method;
public class ceshi {




        public static void main(String[] args) throws Exception{
            Class clazz = Class.forName("java.lang.Runtime");
            Method execMethod = clazz.getMethod("exec", String.class);
            Method getRuntimeMethod = clazz.getMethod("getRuntime");
            Object runtime = getRuntimeMethod.invoke(clazz);
            execMethod.invoke(runtime, "calc.exe");
        }

}

代码分析:

1.Class clazz = Class.forName(“java.lang.Runtime”);// 获取Runtime类对象

2.Method execMethod = clazz.getMethod(“exec”, String.class);//获取 Runtime.exec方法

3.Method getRuntimeMethod = clazz.getMethod(“getRuntime”);//获取 Runtime.getRuntime方法

4.Object runtime = getRuntimeMethod.invoke(clazz);//invoke执行getRuntime方法

4.反射调用类方法

获取当前类所有的成员方法:

Method[] methods = clazz.getDeclaredMethods()

获取当前类指定的成员方法:

Method method = clazz.getDeclaredMethod("方法名");
Method method = clazz.getDeclaredMethod("方法名", 参数类型如String.class,多个参数用","号隔开);

反射调用方法

获取到java.lang.reflect.Method对象以后我们可以通过Methodinvoke方法来调用类方法。

调用类方法代码片段:

method.invoke(方法实例对象, 方法参数值,多个参数值用","隔开);

5.反射调用成员变量

获取当前类的所有成员变量:

Field fields = clazz.getDeclaredFields();

获取当前类指定的成员变量:

Field field  = clazz.getDeclaredField("变量名");

getFieldgetDeclaredField的区别同getMethodgetDeclaredMethod

获取成员变量值:

Object obj = field.get(类实例对象);

修改成员变量值:

field.set(类实例对象, 修改后的值);

6.总结常用方法

• public String getName()
• public Package getPackage()
• public Class getSuperclass()**
**• public Class[] getInterfaces()

• public Field[] getFields()
• public Method[] getMethods()
• public Constructor<?>[] getConstructors()
• public T newInstance()

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/273717.html

(0)
上一篇 2022年7月12日
下一篇 2022年7月12日

相关推荐

发表回复

登录后才能评论