java中反射set方法和get方法,java通过反射获取类的属性

首页 > 技术 > 作者:YD1662023-04-10 13:38:06

上述方法可能是较为常用的,事实上在设置值的方法上,Field类还提供了专门针对基本数据类型的方法,如setInt()/getInt()、setBoolean()/getBoolean、setChar()/getChar()等等方法,这里就不全部列出了,需要时查API文档即可。需要特别注意的是被final关键字修饰的Field字段是安全的,在运行时可以接收任何修改,但最终其实际值是不会发生改变的。

Method类及其用法

Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息,所反映的方法可能是类方法或实例方法(包括抽象方法)。

Method类的主要方法

java中反射set方法和get方法,java通过反射获取类的属性(13)

下面是Class类获取Method对象相关的方法:

java中反射set方法和get方法,java通过反射获取类的属性(14)

同样通过案例演示上述方法:

import java.lang.reflect.Method; public class ReflectMethod { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException { Class clazz = Class.forName("reflect.Circle"); //根据参数获取public的Method,包含继承自父类的方法 Method method = clazz.getMethod("draw", int.class, String.class); System.out.println("method:" method); //获取所有public的方法: Method[] methods = clazz.getMethods(); for (Method m : methods) { System.out.println("m::" m); } System.out.println("========================================="); //获取当前类的方法包含private,该方法无法获取继承自父类的method Method method1 = clazz.getDeclaredMethod("drawCircle"); System.out.println("method1::" method1); //获取当前类的所有方法包含private,该方法无法获取继承自父类的method Method[] methods1 = clazz.getDeclaredMethods(); for (Method m : methods1) { System.out.println("m1::" m); } } } class Shape { public void draw() { System.out.println("draw"); } public void draw(int count, String name) { System.out.println("draw " name ",count=" count); } } class Circle extends Shape { private void drawCircle() { System.out.println("drawCircle"); } public int getAllCount() { return 100; } }

输出结果:

method:public void reflect.Shape.draw(int,java.lang.String)

m::public int reflect.Circle.getAllCount()

m::public void reflect.Shape.draw()

m::public void reflect.Shape.draw(int,java.lang.String)

m::public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException

m::public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException

m::public final void java.lang.Object.wait() throws java.lang.InterruptedException

m::public boolean java.lang.Object.equals(java.lang.Object)

m::public java.lang.String java.lang.Object.toString()

m::public native int java.lang.Object.hashCode()

m::public final native java.lang.Class java.lang.Object.getClass()

m::public final native void java.lang.Object.notify()

m::public final native void java.lang.Object.notifyAll()

=========================================

method1::private void reflect.Circle.drawCircle()

m1::public int reflect.Circle.getAllCount()

m1::private void reflect.Circle.drawCircle()

在通过getMethods方法获取Method对象时,会把父类的方法也获取到,如上的输出结果,把Object类的方法都打印出来了。而getDeclaredMethod/getDeclaredMethods方法都只能获取当前类的方法。我们在使用时根据情况选择即可。下面将演示通过Method对象调用指定类的方法:

Class clazz = Class.forName("reflect.Circle");

//创建对象

Circle circle = (Circle) clazz.newInstance();

//获取指定参数的方法对象

MethodMethod method = clazz.getMethod("draw",int.class,String.class);

//通过Method对象的invoke(Object obj,Object... args)方法调用

method.invoke(circle,15,"圈圈");

//对私有无参方法的操作

Method method1 = clazz.getDeclaredMethod("drawCircle");

//修改私有方法的访问标识

method1.setAccessible(true);

method1.invoke(circle);

//对有返回值得方法操作

Method method2 =clazz.getDeclaredMethod("getAllCount");

Integer count = (Integer) method2.invoke(circle);

System.out.println("count:" count);

输出结果

draw 圈圈,count=15

drawCircle

count:100

在上述代码中调用方法,使用了Method类的invoke(Object obj,Object... args)第一个参数代表调用的对象,第二个参数传递的调用方法的参数。这样就完成了类方法的动态调用。

三. 反射机制执行的流程

-- 测试代码

java中反射set方法和get方法,java通过反射获取类的属性(15)

-- 执行流程图

java中反射set方法和get方法,java通过反射获取类的属性(16)

上一页12345下一页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.