java反射机制(基础版)
package com.reflect; import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method; /**
* java反射机制的基础方法
* @author dr
*
*/
public class ReflectTest {
public static void main(String[] args) throws Exception {
//每个类被加载之后 系统都会为其生成一个Class对象,通过该Class对象可以访问该类的xinxi
//1、获取Class对象(三种方式)
// 1> Class.forName();
Class p1 = Class.forName("com.reflect.Person");
// 2>类.class属性获取Class对象
Class p2 = Person.class;
// 3>对象的getClass()方法获取Class对象
Person person = new Person();
Class p3 = person.getClass();
//2、创建对象
// 1>Class对象的newInstance()方法 创建对象 使用默认的构造器构造实例
Person p = (Person) p1.newInstance();
// 2>使用Class对象获取指定的构造器 在用构造器对象的newInstance()的方法创建对象
Constructor<Person> actor = p2.getConstructor(String.class,String.class);
p = actor.newInstance("bai","123");
System.out.println(p.getName());
//3、用Class对象获取信息
// 1>获取构造函数 返回所有的构造函数 与访问级别没有关系
Constructor<Person>[] actors = p2.getDeclaredConstructors();
for(Constructor<Person> a:actors){
System.out.println(a.getName());
}
// 2>获取构造函数 返回所有的构造函数 只获取public 的构造函数
Constructor<Person>[] acts = p2.getConstructors();
for(Constructor<Person> a:acts){
System.out.println(a.getName());
}
// 3>返回指定参数的构造函数
//(使用getConstructor()只能获取取到public类型的构造函数,此时报错:java.lang.NoSuchMethodException)
//Constructor<Person> single = p2.getConstructor(String.class);
//(使用getConstructor()只能获取取到public类型的构造函数,此时报错:
//ReflectTest can not access a member of class com.reflect.Person with modifiers "private")
//这个时候设置可以访问私有属性或方法的权限即可
Constructor<Person> single = p2.getDeclaredConstructor(String.class);
single.setAccessible(true);
Person pp = single.newInstance("name");
System.out.println(pp.getName());
// 4> 获取和调用方法 (获取所有的方法 以及所有共有的方法 指定的方法 为私有方法设置访问权限等 与construct类似)
Method method = p2.getMethod("getName",null);
System.out.println(method.invoke(p, null));
//设置方法名称 和 该方法所需参数的类型的Class
Method m = p2.getDeclaredMethod("setName", String.class);
//调用的使用要指定哪个对象调用的 和传入的参数
m.invoke(p, "baichuanyu");
System.out.println(p.getName());
// 5> 访问属性值
//name属性是私有属性
Field field = p2.getDeclaredField("name");
//报错:Class ReflectTest can not access Person with modifiers "private"
//field.set(p, "field");
//为Person对象 p 的私有属性name赋值 field
field.setAccessible(true);
field.set(p, "field");
System.out.println(p.getName());
}
} class Person{
private String name;
private String age; public Person(){ } private Person(String name){
this.name = name;
} public Person(String name, String age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
} }
java反射机制(基础版)的更多相关文章
- java反射机制基础
java反射机制: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和 属性:这种动态获取信息以及动态调用对象方法的功能称为j ...
- java反射机制基础总结
1反射机制是啥? 反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变.通俗的讲就是反射可以在运行时根据指定的类名获得类的信息. 2反射机制有啥用? Reflection(反射) ...
- JAVA反射机制基础概念
反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力.通过这种能力可以彻底的了解自身的情况为下一步的动作做准备.下面具体介绍一下java的反射机制.这里你将颠覆原来对java的理解. J ...
- java基础知识(十一)java反射机制(上)
java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...
- 【java基础】Java反射机制
一.预先需要掌握的知识(java虚拟机) 1)java虚拟机的方法区: java虚拟机有一个运行时数据区,这个数据区又被分为方法区,堆区和栈区,我们这里需要了解的主要是方法区.方法区的主要作用是存 ...
- Java基础学习总结(75)——Java反射机制及应用场景
什么是Java反射机制? JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的以及动态调用对象的方法的功能称为 ...
- 夯实Java基础(二十一)——Java反射机制
1.反射机制概述 Java反射机制是指程序在运行状态中,对于任何一个类,我们都能够知道这个类的所有属性和方法(包括private.protected等).对于任何一个对象,我们都能够对它的属性和方法进 ...
- Java 基础之详解 Java 反射机制
一.什么是 Java 的反射机制? 反射(Reflection)是Java的高级特性之一,是框架实现的基础,定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: ...
- java基础知识(十一)java反射机制(下)
1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...
随机推荐
- vhdl基础---分频
偶数分频 ibrary IEEE; use IEEE.STD_LOGIC_1164.ALL; use ieee.std_logic_arith; use ieee.std_logic_unsigned ...
- 28335 sci fifo send
#include "DSP2833x_Device.h"#include "DSP2833x_Examples.h"char buf[]={0x30,0x32, ...
- ASP.NET Web API 入门大杂烩
[前言] 本文是大杂烩,意思即是:到处Copy再加一点点思考而混在一起的文章,引用来源因为太多太杂故而省略,望原作者原谅. [概述] ASP.NET Web API随ASP.NET MVC 4一起发行 ...
- angular2 国际化实现
angular2国际化通过管道(pipe)的形式实现下载ng2-translate 如何使用可以参照https://github.com/ocombe/ng2-translate 自己写了一个小DEM ...
- 在数据表中添加一个字段的SQL语句怎么写
如果要在数据表中添加一个字段,应该如何表示呢?下面就为您介绍表添加字段的SQL语句的写法,希望可以让您对SQL语句有更深的认识. 通用式: alter table [表名] add [字段名] 字 ...
- [shell基础]——tr命令
(1) tr 字符替换 测试文本内容 # cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4. ...
- Midway-ModelProxy — 轻量级的接口配置建模框架
Midway-ModelProxy - 轻量级的接口配置建模框架 前言 使用Node做前后端分离的开发模式带来了一些性能及开发流程上的优势(见<前后端分离的思考与实践 一>), 但同时也面 ...
- Java中HashMap排序
注: 转载于 http://www.cnblogs.com/xingyun/archive/2012/12/09/2809962.html package com.holdobject; import ...
- poj 1300 Door Man 欧拉回路
题目链接:http://poj.org/problem?id=1300 You are a butler in a large mansion. This mansion has so many ro ...
- Winform 打印PDF顺序混乱,获取打印队列
工作中PDF打印顺序混乱着实让我疼痛了好久,其实决绝方法非常简单,但没有想到这个点子的时候确实让我走了很多弯路 这里文章写出来并不是为了炫耀什么,只是觉得发现些好东西就分享出来而已,同时也做个记录,方 ...