java 通过反射调用属性,方法,构造器

package reflection2;

import static org.junit.Assert.assertArrayEquals;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.junit.jupiter.api.Test;

import reflection1.Person;

/*
 * 调用运行时类中指定的结构:属性,方法,构造器
 * */

public class ReflectionTest {

    /*
     *
     *
     * */
    @Test
    public void test1() throws NoSuchFieldException, SecurityException, InstantiationException, IllegalAccessException {
        Class clazz = Person.class;

        //创建运行时类对象
        Person person = (Person)clazz.newInstance();

        //获取指定变量名的属性
        Field name = clazz.getDeclaredField("name");

        //将权限修改为可获得
        name.setAccessible(true);

        //设置当前对象的属性值:set()方法:参数1:指明设置哪个对象的属性,参数2:将属性设置为多少
        name.set(person, "Tom");

        /*
         * 获取当前属性值get():参数1:获取哪个对象的属性值
         * */
        int pAge = (int)name.get(person);
        System.out.println(pAge);
    }

    /*
     * 操作运行时类中指定的方法
     * */
    @Test
    public void test2() throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
        Class clazz = Person.class;

        //创建运行时类对象
        Person person = (Person)clazz.newInstance();

        //获取指定的某个方法
        //参数1:指明获取方法的名称,参数2:指明获取方法的形参列表
        Method show = clazz.getDeclaredMethod("show", String.class);

        //将权限改为可访问
        show.setAccessible(true);

        //invoke():参数1:方法调用者 参数2:给方法形参赋值的实参
        //返回值 为调用的方法的返回值
        String nation = (String)show.invoke(person,"CHN");
        System.out.println(nation);

        System.out.println("*********************调用静态方法**********************");
        Method showDesc = clazz.getDeclaredMethod("showDesc");
        showDesc.setAccessible(true);
        //直接用这个类去调用就行
        showDesc.invoke(Person.class);
    }

    /*
     * 调用运行时类的指定的构造器
     * */
    @Test
    public void test3() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        Class clazz = Person.class;

        //获取指定的构造器:参数:指明构造器的参数列表
        Constructor constructor = clazz.getDeclaredConstructor(String.class);

        //将权限改为可访问
        constructor.setAccessible(true);

        Person person = (Person)constructor.newInstance("Tom");
        System.out.println( person);
    }

}

1

原文地址:https://www.cnblogs.com/zsben991126/p/11888622.html

时间: 2024-09-29 22:19:02

java 通过反射调用属性,方法,构造器的相关文章

创建运行时类的对象,调用指定的属性方法构造器

1 使用newInstance(),实际上是调用运行时空参的构造器    注意构造器的权限修饰符要足够,同时必须有一个空参的构造器. 2 调用指定的属性方法构造器 package lianxi1; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Meth

java动态加载指定的类或者jar包反射调用其方法

序言 有时候,项目中会用到java动态加载指定的类或者jar包反射调用其方法来达到模块的分离,使各个功能之间耦合性大大降低,更加的模块化,代码利用率更高.模式中的代理模式就用到java的这一机制.下边就让我们通过代码来看看如何实现此功能. 代码详细 package loadjarclass; import java.io.File; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoad

java动态载入指定的类或者jar包反射调用其方法

序言 有时候.项目中会用到java动态载入指定的类或者jar包反射调用其方法来达到模块的分离,使各个功能之间耦合性大大减少,更加的模块化.代码利用率更高.模式中的代理模式就用到java的这一机制. 下边就让我们通过代码来看看怎样实现此功能. 代码具体 package loadjarclass; import java.io.File; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoa

跟王老师学反射(七)使用反射调用属性

跟王老师学反射(七):使用反射调用属性 主讲教师:王少华   QQ群号:483773664 学习内容 使用反射调用属性 通过Class对象的getFields()|getDeclaredFields()或getField()|getDeclaredField()方法可以获取该类所有包括的全部属性或指定的属性 一.Field类用于猎取类中的属性的方法 (一)getXxx(Object obj) 获取obj对象该Field的属性值,此处Xxx对应8个基本类型. (二)setXxx(Object ob

VS2010 F5调试时出现:“ 尝试运行项目时出错:未捕获通过反射调用的方法引发的异常”解决

S2010 F5调试时出现 尝试运行项目时出错:未捕获通过反射调用的方法引发的异常 两个解决方法:1) 打开项目属性,选择调试选项卡,将“启用非托管代码调试”一项钩上.2) 打开项目属性,选择调试选项卡,将“启用Visual Studio宿主进程“一项钩掉. 原文地址:https://www.cnblogs.com/gisoracle/p/9690123.html

Java:子类调用超类方法的一种特殊情况

在Java的子类中,可以通过super来明确调用超类(也即父类)的方法.但当所调用的超类的方法(1)中又调用了其它的方法(2)时,由于Java默认动态绑定,所以方法(2)调用的是子类中的方法.如下,示例(1)是一般的子类调用超类方法(即所调用的超类中的方法不再调用其它的需要动态绑定的方法),示例(2)是特殊的子类调用超类方法. 示例(1): package MyTest; import java.util.*; public class MyTest { public static void m

java反射调用私有方法和修改私有属性

//调用私有方法package com.java.test; public class PrivateMethod { private String sayHello(String name) { return "hello "+name; } } 测试: package com.java.test; import java.lang.reflect.Method; public class PrivateMethodTest { public static void main(Str

java的反射机制使用方法

什么是反射? Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性.对于任何一个对象,我们都能够对它的方法和属性进行调用.我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制.   反射的三种方式: 方式一:利用对象获取类--------------不推荐(已经获取到对象,再用反射意义不大) public static void main(String[] args) { Person person = new Person(); Class<?> c

Java框架JNA调用C方法(windows链接库dll文件、linux链接库so文件)

介绍 给大家介绍一个最新的访问本机代码的Java框架-JNA. JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架. JNA项目地址:https://jna.dev.java.net/ 非常强大.易用,功能上类似与.NET的P/Invoke. 不堪回首的JNI 我们知道,使用JNI调用.dll/.so共享类库是非常非常麻烦和痛苦的. 如果有一个现有的.dll/.so文件,如果使用JNI技术调用,我们首先需要另