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

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

  1. 反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性、字段),而不去使用Invoke方法)

    反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性.字段),而不去使用Invoke方法)   创建Delegate (1).Delegate.CreateDelegate(Type, ...

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

    序言 有时候.项目中会用到java动态载入指定的类或者jar包反射调用其方法来达到模块的分离,使各个功能之间耦合性大大减少,更加的模块化.代码利用率更高.模式中的代理模式就用到java的这一机制. 下 ...

  3. 【转】Java利用反射机制访问私有化构造器

    Java利用反射机制访问私有化构造器 博客分类: java   我们都知道,当一个类的构造方法被设为私有的时候(private),在其他类中是无法用new来实例化一个对象的. 但是有一种方法可以把带有 ...

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

    VS2010 F5调试时出现 尝试运行项目时出错:未捕获通过反射调用的方法引发的异常 两个解决方法:1) 打开项目属性,选择调试选项卡,将“启用非托管代码调试”一项钩上.2) 打开项目属性,选择调试选 ...

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

    //调用私有方法package com.java.test; public class PrivateMethod { private String sayHello(String name) { r ...

  6. java利用反射调用类的某个方法

    java利用反射机制 可以动态调用某个类的某个方法,在 扩展系统功能或提供对外接口时经常用的到. 代码如下: 打印类Print.java package com.test.reflct; /** * ...

  7. java通过反射调用有参数的方法

    public static void eachCfg(Class Initclass,String taskType){ Field[] fields = Initclass.getDeclaredF ...

  8. java通过反射调用不同参数的方法

    import java.lang.reflect.Method; public class testReflect { /** * @param args */ public static void ...

  9. java 使用反射调用方法

    每个Method的对象对应一个具体的底层方法.获得Method对象后,程序可以使用Method里面的invoke方法来执行该底层方法. Object invoke(Object obj,Object ...

随机推荐

  1. tr:hover变色的问题

    做表格隔行变色(高亮显示),可以通过设置css中的 tr:hover伪类属性达到效果, 但是,会出一点小问题.td的背景色会覆盖tr的背景色, 在tr:hover下边加上一句:tr:hover td{ ...

  2. Vagrant 入门 - share

    原文地址 译者注:Vagrant Share 功能通过 ngrok 向所有人提供访问内网开发环境的能力. 现在我们已经启动并运行了一台 Web 服务器,并且可以从你的机器访问,我们拥有一个相当实用的开 ...

  3. 精讲 org.w3c.dom(java dom)解析XML文档

    org.w3c.dom(java dom)解析XML文档 位于org.w3c.dom操作XML会比较简单,就是将XML看做是一颗树,DOM就是对这颗树的一个数据结构的描述,但对大型XML文件效果可能会 ...

  4. React后台管理手动封装图片上传组件

    分为两个文件夹,index.js(逻辑文件) styled.js(样式文件) index.js文件,编写完成之后在对应的地方引入即可 import React from "react&quo ...

  5. [JSOI2007]建筑抢修(贪心+后悔)

    [JSOI2007]建筑抢修(贪心+后悔) 洛谷题目传送门 吐槽 这是一道经典的贪心后悔的题目 做过贪心加后悔的题目的应该一眼可以看出来 解题思路 首先按倒塌时间T2排序,再从1枚举到n,能修就修,发 ...

  6. luoguP1311 选择客栈 题解(NOIP2011)

    P1311 选择客栈  题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<c ...

  7. Warning: session_start(): open(/var/lib/php/session/)

    Warning: session_start(): open(/var/lib/php/session/) 今天放置一个新的站点www.96net.com.cn在里面,登陆后台出现这种错,之后再lin ...

  8. js 柯里化、深拷贝、浅拷贝

    curry const sum = (a, b, c, d) => a + b + c + d const curry = fn => (judge = (...args) => a ...

  9. tornado ioloop current和instance的一些区别

    import tornado.ioloop # 此时_current没有instance print dir(tornado.ioloop.IOLoop._current) # 通过instance ...

  10. React Native实践总结一

    一.React的世界观1.通过改变state来改变视图视图不用考虑如何改变自己,把state画出来即可.2.变量不可变通过创建一个新的state来更改state,使得变更可追踪,不容易因为其他部分修改 ...