- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java 反射机制实例详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
Java 反射机制实例详解 。
1、JAVA是动态语言吗?
一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,Java和C++一样,都不是动态语言.
但JAVA它却有着一个非常突出的动态相关机制:反射。通过反射,Java可以于运行时加载、探知和使用编译期间完全求和的类、生成其对象实体,调用其方法或者对属性设值。所以Java算是一个半动态的语言吧.
反射的概念:
在Java中的反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,
对于任意一个对象,都能够调用它的任意一个方法,
这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制 。
2、动态性质 。
2.1、动态性质 。
运行时生成对象实例; 运行期间调用方法; 运行时更改属性 。
2.2、Java反射机制能实现的功能 。
在运行时判断任意一个对象所属的类 在运行时构造任意一个类的对象 在运行时判断任意怀个类所具有的方法和属性 在运行时调用任意一个对象的方法 生成动态代理 。
2.3、Java反射应用场合 。
在Java程序中许多对象在运行时都会出现两种类型:编译时类型和运行时类型 。
编译时的类型由声明该对象时使用的类型决定,运行时的类型由实际赋给对象的类型决定 。
如:
1
|
Person p =
new
Student();
|
编译时类型为Person,而运行时为Student 。
除此之外,程序在运行时还可能接收到外部传入的一个对象,该对象的编译时类型为Object,但程序又需要调用该对象运行时类型的方法。为了这些问题程序需要在运行时发现对象和类的真实信息。然而,如果编译时根本无法预知该对象和类可能属于哪些类,程序只依靠运行时信息来发现该对象和类的真实信息,此时就必须使用反射 。
3、Java反射API 。
反射API用来生成在当前JAVA虚拟机中的类、接口或者对象的信息.
Class类:反射的核心类,可以获取类的属性,方法等内容信息。 Field类:Java.lang.reflect.表示类的属性,可以获取和设置类的中属性值。 Method类:Java.lang.reflect。表示类的方法,它可以用来获取类中方法的信息或者执行方法 Construcor类:Java.lang.reflect。表示类的构造方法.
4、获取全部方法和属性 。
Person类 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
package
com.pb.Reflect.classinfo;
public
class
Person {
private
String name;
private
String gender;
private
int
age;
private
Person() {
//
}
public
Person(String name, String gender,
int
age) {
super
();
this
.name = name;
this
.gender = gender;
this
.age = age;
}
//getter、和setter方法
private
String getName() {
return
name;
}
private
void
setName(String name) {
this
.name = name;
}
public
String getGender() {
return
gender;
}
public
void
setGender(String gender) {
this
.gender = gender;
}
public
int
getAge() {
return
age;
}
public
void
setAge(
int
age) {
this
.age = age;
}
public
String toString(){
return
"姓名:"
+name+
"年龄: "
+age;
}
}
|
使用反射
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
package
com.pb.Reflect.classinfo;
import
java.lang.reflect.Constructor;
import
java.lang.reflect.Field;
import
java.lang.reflect.Method;
import
javax.swing.JOptionPane;
/*
* 通过用户输入类的全路径,来获取该类的成员方法和属性
* Declared获取全部不管是私有和公有
* 1.获取访问类的Class对象
* 2.调用Class对象的方法返回访问类的方法和属性信息
*/
public class ReflectDemo {
/*
* 构造方法
*/
public
ReflectDemo(){
//用户输入类的全路径径
//使用String组件
String classpsth=JOptionPane.showInputDialog(
null
,
"输入类的全路径"
);
//使用Class.forName方法根据输入的类的全路径 返回该类的Class对象
try
{
Class cla = Class.forName(classpsth);
//利用Class对象的cla的自审,返回方法对象集合
Method [] method=cla.getDeclaredMethods();
//返回所有的方法
System.out.println(
"========获取方法信息============"
);
for
(Method meth : method) {
//遍历method数组,并输出方法信息
System.out.println(meth.toString());
}
System.out.println(
"========获取出方法信息结束============"
);
//获取属性利用Class对象的cla的自审,返回成员属性对象集合
Field [] field=cla.getDeclaredFields();
System.out.println(
"========获取成员属性信息============"
);
for
(Field f : field) {
System.out.println(f.toString());
}
System.out.println(
"========获取成员属性信息结束============"
);
//获取属性利用Class对象的cla的自审,返回构造方法集合
Constructor [] constructor=cla.getDeclaredConstructors();
System.out.println(
"========获取成员构造方法信息============"
);
for
(Constructor constru : constructor) {
System.out.println(constru.toString());
}
System.out.println(
"========获取成员构造方法信息结束============"
);
}
catch
(ClassNotFoundException e) {
e.printStackTrace();
System.out.println(
"路径输入错误!"
);
}
}
}
|
1
2
3
4
5
6
7
8
9
10
|
package
com.pb.Reflect.classinfo;
public
class
TestReflection {
public
static
void
main(String[] args) {
ReflectDemo rd=
new
ReflectDemo();
}
}
|
输入com.pb.Reflect.classinfo.Person 。
结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
========获取方法信息============
public
java.lang.String com.pb.Reflect.classinfo.Person.getGender()
public
void
com.pb.Reflect.classinfo.Person.setGender(java.lang.String)
public
int
com.pb.Reflect.classinfo.Person.getAge()
public
void
com.pb.Reflect.classinfo.Person.setAge(
int
)
public
java.lang.String com.pb.Reflect.classinfo.Person.toString()
private
java.lang.String com.pb.Reflect.classinfo.Person.getName()
private
void
com.pb.Reflect.classinfo.Person.setName(java.lang.String)
========获取出方法信息结束============
========获取成员属性信息============
private
java.lang.String com.pb.Reflect.classinfo.Person.name
private
java.lang.String com.pb.Reflect.classinfo.Person.gender
private
int
com.pb.Reflect.classinfo.Person.age
========获取成员属性信息结束============
========获取构造方法信息============
private
com.pb.Reflect.classinfo.Person()
public
com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,
int
)
========获取构造方法信息结束============
|
5、使用反射的步骤 。
5.1、步骤 。
Java.lang.reflect 。
获得想操作类的Java.lang.Class对象 调用Class的方法 使用反射API来操作这些信息 。
5.2、获取Class对象方式 。
调用某个对象的getClass()方法 。
1
2
|
Person p =
new
Person();
Class cla=p.getClass();
|
调用某个类的class属性来获取该类对应的Class对象 。
1
|
Class cls=Person.
class
;
|
使用Class类的forName()静态方法 。
1
|
Class cla=Class.forName(“类的全路径”);
|
6、第二种方式对象的getClass()方法 。
Person类,因为要声明对象所以将构造方法public 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
package
com.pb.Reflect.classinfo;
public
class
Person {
private
String name;
private
String gender;
private
int
age;
public
Person() {
//
}
public
Person(String name, String gender,
int
age) {
super
();
this
.name = name;
this
.gender = gender;
this
.age = age;
}
//getter、和setter方法
private
String getName() {
return
name;
}
private
void
setName(String name) {
this
.name = name;
}
public
String getGender() {
return
gender;
}
public
void
setGender(String gender) {
this
.gender = gender;
}
public
int
getAge() {
return
age;
}
public
void
setAge(
int
age) {
this
.age = age;
}
public
String toString(){
return
"姓名:"
+name+
"年龄: "
+age;
}
}
|
使用反射
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
package
com.pb.Reflect.classinfo;
import
java.lang.reflect.Constructor;
import
java.lang.reflect.Field;
import
java.lang.reflect.Method;
import
javax.swing.JOptionPane;
/*
* 通过用户输入类的全路径,来获取该类的成员方法和属性
* Declared获取全部不管是私有和公有
* 1.获取访问类的Class对象
* 2.调用Class对象的方法返回访问类的方法和属性信息
*/
public
ReflectDemo(Person p){
Class cla=p.getClass();
//利用Class对象的cla的自审,返回方法对象集合
Method [] method=cla.getDeclaredMethods();
//返回所有的方法
System.out.println(
"========获取方法信息============"
);
for
(Method meth : method) {
//遍历method数组,并输出方法信息
System.out.println(meth.toString());
}
System.out.println(
"========获取出方法信息结束============"
);
//获取属性利用Class对象的cla的自审,返回成员属性对象集合
Field [] field=cla.getDeclaredFields();
System.out.println(
"========获取成员属性信息============"
);
for
(Field f : field) {
System.out.println(f.toString());
}
System.out.println(
"========获取成员属性信息结束============"
);
//获取属性利用Class对象的cla的自审,返回构造方法集合
Constructor [] constructor=cla.getDeclaredConstructors();
System.out.println(
"========获取成员构造方法信息============"
);
for
(Constructor constru : constructor) {
System.out.println(constru.toString());
}
System.out.println(
"========获取成员构造方法信息结束============"
);
}
}
|
测试类 。
1
2
3
4
5
6
7
8
9
10
11
|
package
com.pb.Reflect.classinfo;
public
class
TestReflection {
public
static
void
main(String[] args) {
Person p=
new
Person();
ReflectDemo rd=
new
ReflectDemo(p);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
========获取方法信息============
public
java.lang.String com.pb.Reflect.classinfo.Person.getGender()
public
void
com.pb.Reflect.classinfo.Person.setGender(java.lang.String)
public
int
com.pb.Reflect.classinfo.Person.getAge()
public
void
com.pb.Reflect.classinfo.Person.setAge(
int
)
public
java.lang.String com.pb.Reflect.classinfo.Person.toString()
private
java.lang.String com.pb.Reflect.classinfo.Person.getName()
private
void
com.pb.Reflect.classinfo.Person.setName(java.lang.String)
========获取出方法信息结束============
========获取成员属性信息============
private
java.lang.String com.pb.Reflect.classinfo.Person.name
private
java.lang.String com.pb.Reflect.classinfo.Person.gender
private
int
com.pb.Reflect.classinfo.Person.age
========获取成员属性信息结束============
========获取成员构造方法信息============
public
com.pb.Reflect.classinfo.Person()
public
com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,
int
)
========获取成员构造方法信息结束============
|
7、第三种方法类的.class属性 。
Person类同上 。
测试类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
package
com.pb.Reflect.classinfo;
import
java.lang.reflect.Constructor;
import
java.lang.reflect.Field;
import
java.lang.reflect.Method;
public
class
TestReflection {
public
static
void
main(String[] args) {
/*第二种方法
Person p=new Person();
ReflectDemo rd=new ReflectDemo(p);
*/
/*
* 第三种方式.class属性
*/
Class cla=Person.
class
;
//利用Class对象的cla的自审,返回方法对象集合
Method [] method=cla.getDeclaredMethods();
//返回所有的方法
System.out.println(
"========获取方法信息============"
);
for
(Method meth : method) {
//遍历method数组,并输出方法信息
System.out.println(meth.toString());
}
System.out.println(
"========获取出方法信息结束============"
);
//获取属性利用Class对象的cla的自审,返回成员属性对象集合
Field [] field=cla.getDeclaredFields();
System.out.println(
"========获取成员属性信息============"
);
for
(Field f : field) {
System.out.println(f.toString());
}
System.out.println(
"========获取成员属性信息结束============"
);
//获取属性利用Class对象的cla的自审,返回构造方法集合
Constructor [] constructor=cla.getDeclaredConstructors();
System.out.println(
"========获取成员构造方法信息============"
);
for
(Constructor constru : constructor) {
System.out.println(constru.toString());
}
System.out.println(
"========获取成员构造方法信息结束============"
);
}
}
|
结果:
同上 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
========获取方法信息============
public
java.lang.String com.pb.Reflect.classinfo.Person.getGender()
public
void
com.pb.Reflect.classinfo.Person.setGender(java.lang.String)
public
int
com.pb.Reflect.classinfo.Person.getAge()
public
void
com.pb.Reflect.classinfo.Person.setAge(
int
)
public
java.lang.String com.pb.Reflect.classinfo.Person.toString()
private
java.lang.String com.pb.Reflect.classinfo.Person.getName()
private
void
com.pb.Reflect.classinfo.Person.setName(java.lang.String)
========获取出方法信息结束============
========获取成员属性信息============
private
java.lang.String com.pb.Reflect.classinfo.Person.name
private
java.lang.String com.pb.Reflect.classinfo.Person.gender
private
int
com.pb.Reflect.classinfo.Person.age
========获取成员属性信息结束============
========获取成员构造方法信息============
public
com.pb.Reflect.classinfo.Person()
public
com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,
int
)
========获取成员构造方法信息结束============
|
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持! 。
原文链接:http://blog.csdn.net/qq_37267015/article/details/77365933 。
最后此篇关于Java 反射机制实例详解的文章就讲到这里了,如果你想了解更多关于Java 反射机制实例详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
一、反射 1.定义 Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法(即使是私有的);对于任意一个对象,都能够调用它的任意方法和属性,那么,我
有没有办法从 JavaScript 对象内部获取所有方法(私有(private)、特权或公共(public))?这是示例对象: var Test = function() { // private m
我有一个抽象类“A”,类“B”和“C”扩展了 A。我想在运行时根据某些变量创建这些实例。如下所示: public abstract class A { public abstract int
假设我们在内存中有很多对象。每个都有一个不同的ID。如何迭代内存以找到与某些 id 进行比较的特定对象?为了通过 getattr 获取并使用它? 最佳答案 您应该维护这些对象的集合,因为它们是在类属性
假设我有这个结构和一个方法: package main import ( "fmt" "reflect" ) type MyStruct struct { } func (a *MyS
C#反射简介 反射(Reflection)是C#语言中一种非常有用的机制,它可以在运行时动态获取对象的类型信息并且进行相应的操作。 反射是一种在.NET Framework中广
概述 反射(Reflection)机制是指在运行时动态地获取类的信息以及操作类的成员(字段、方法、构造函数等)的能力。通过反射,我们可以在编译时期未知具体类型的情况下,通过运行时的动态
先来看一段魔法吧 public class Test { private static void changeStrValue(String str, char[] value) {
结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套; go中的struct类型理解为类,可以定义方法,和函数定义有些许区别; struct类型是值类型
反射 1. 反射的定义 Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到那么,我们
反射的定义 java的反射(reflection) 机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到嘛,那么,我们就可以
我有一个 Java POJO: public class Event { private String id; private String name; private Lon
我编写了以下函数来检查给定的单例类是否实现了特征。 /** Given a singleton class, returns singleton object if cls implements T.
我正在研究 Java 反射的基础知识并观察有关类方法的信息。我需要获得一个符合 getMethod() 函数描述的规范的方法。然而,当我这样做时,我得到了一个 NoSuchMethodExceptio
我正在通过以下代码检索 IEnumerable 属性列表: BindingFlags bindingFlag = BindingFlags.Instance | BindingFlags.Public
我需要检查属性是否在其伙伴类中定义了特定属性: [MetadataType(typeof(Metadata))] public sealed partial class Address { p
我正在尝试使用 Reflections(由 org.reflections 提供)来处理一些繁重的工作,因此我不需要在很长的时间内为每个类手动创建一个实例列表。但是,Reflections 并未按照我
scala 反射 API (2.10) 是否提供更简单的方法来搜索加载的类并将列表过滤到实现定义特征的特定类? IE; trait Widget { def turn(): Int } class
我想在运行时使用反射来查找具有给定注释的所有类,但是我不知道如何在 Scala 中这样做。然后我想获取注释的值并动态实例化每个映射到关联注释值的带注释类的实例。 这是我想要做的: package pr
这超出了我的头脑,有人可以更好地向我解释吗? http://mathworld.wolfram.com/Reflection.html 我正在制作一个 2d 突破格斗游戏,所以我需要球能够在它击中墙壁
我是一名优秀的程序员,十分优秀!