- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java中反射详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
阅读目录 。
Java反射API 。
Java反射指的是在运行状态时,能够获取类的属性和方法或者修改类运行时行为的过程.
java.lang.Class类提供了很多方法用于获取元数据、检查和改变类运行时的行为.
Java的反射主要涉及java.lang和java.lang.reflect包下的类.
反射应用场景举例 。
java.lang.Class类 。
java.lang.Class主要提供了以下两个功能:
java.lang.Class类常用方法 。
。
Method | Description |
---|---|
1) public String getName() | 返回类名 |
2) public static Class forName(String className)throws ClassNotFoundException | 加载类并返回Class对象 |
3) public Object newInstance()throws InstantiationException,IllegalAccessException | 创建实例对象 |
4) public boolean isInterface() | 判断是否是接口 |
5) public boolean isArray() | 判断是否是数组 |
6) public boolean isPrimitive() | 判断是否是原始数据类型 |
7) public Class getSuperclass() | 返回父类Class引用 |
8) public Field[] getDeclaredFields()throws SecurityException | 返回类的成员属性字段数组 |
9) public Method[] getDeclaredMethods()throws SecurityException | 返回类的方法数组 |
10) public Constructor[] getDeclaredConstructors()throws SecurityException | 返回类的构造方法数组 |
11) public Method getDeclaredMethod(String name,Class[] parameterTypes)throws NoSuchMethodException,SecurityException | 返回类中指定参数类型的方法 |
。
怎样获取Class对象 。
有三种方式,如下:
forName()方法示例 。
可用于动态加载,当你知道类的全限定名时,可以使用该方式。注意原始数据类型不适用该方法; 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package
tmp;
class
Simple
{
}
public
class
Test
{
public
static
void
main(String args[])
throws
ClassNotFoundException
{
Class<?> c = Class.forName(
"tmp.Simple"
);
System.out.println(c.getName());
System.out.println(c.getSimpleName());
}
}
|
1
2
|
tmp.Simple
Simple
|
getClass()方法示例:
从实例对象中获取Class对象 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package
tmp;
class
Simple
{
}
public
class
Test
{
void
printName(Object obj)
{
}
public
static
void
main(String args[])
{
Simple s =
new
Simple();
Class<?
extends
Object> c = s.getClass();
System.out.println(c.getName());
System.out.println(c.getSimpleName());
}
}
|
1
2
|
tmp.Simple
Simple
|
.class语法示例 。
作用于类名上,也可应用于原始数据类型,如下所示:
1
2
3
4
5
6
7
8
9
10
11
|
package
tmp;
public
class
Test
{
public
static
void
main(String args[])
{
Class<Boolean> c =
boolean
.
class
;
System.out.println(c.getName());
Class<Test> c2 = Test.
class
;
System.out.println(c2.getName());
}
}
|
1
2
|
boolean
tmp.Test
|
判断Class对象对应的类型 。
以下方法可用于判断Class对象对应的类型:
。
1) public boolean isInterface(): 是否对应接口 |
2) public boolean isArray(): 是否对应数组 |
3) public boolean isPrimitive(): 是否对应原始数据类型 |
。
代码示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package
tmp;
class
Simple
{
}
interface
My
{
}
public
class
Test
{
public
static
void
main(String args[])
{
try
{
Class<?> c = Class.forName(
"tmp.Simple"
);
System.out.println(c.isInterface());
Class<?> c2 = Class.forName(
"tmp.My"
);
System.out.println(c2.isInterface());
}
catch
(Exception e)
{
System.out.println(e);
}
}
}
|
1
2
|
false
true
|
通过反射创建实例对象 。
有两种方式,如下:
所以,通常来讲,第二种方式比第一种使用范围更广.
Class对象调用newInstance()方法示例 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package
tmp;
class
Simple
{
void
message()
{
System.out.println(
"Hello Java"
);
}
}
public
class
Test
{
public
static
void
main(String args[])
{
try
{
Class<?> c = Class.forName(
"tmp.Simple"
);
Simple s = (Simple) c.newInstance();
s.message();
}
catch
(Exception e)
{
System.out.println(e);
}
}
}
|
Hello Java 。
Constructor对象调用newInstance()方法示例 。
注意这里可以根据传入参数的类型来得到指定的构造方法,还可以改变构造方法的访问权限限制.
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
|
package
tmp;
import
java.lang.reflect.Constructor;
class
Simple
{
private
String msg;
void
message()
{
System.out.println(
"Hello Java,"
+ msg);
}
private
Simple(String s){
this
.msg = s;
}
}
public
class
Test
{
public
static
void
main(String args[])
{
try
{
Class<?> c = Class.forName(
"tmp.Simple"
);
Constructor<?> con = c.getDeclaredConstructor(String.
class
);
con.setAccessible(
true
);
Simple s = (Simple) con.newInstance(
"..."
);
s.message();
}
catch
(Exception e)
{
System.out.println(e);
}
}
}
|
Hello Java,... 。
通过反射调用私有方法 。
通过反射,我们可以调用其它类的私有方法,主要涉及java.lang.Class和java.lang.reflect.Method类; 。
其中主要是用到了Method类的setAccessible方法和invoke方法,前者修改访问权限,后者调用方法.
通过调用有参私有方法示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package
tmp;
import
java.lang.reflect.Method;
class
A
{
private
void
cube(
int
n)
{
System.out.println(n * n * n);
}
}
class
Test
{
public
static
void
main(String args[])
throws
Exception
{
Class<A> c = A.
class
;
Object obj = c.newInstance();
Method m = c.getDeclaredMethod(
"cube"
,
new
Class[]{
int
.
class
});
m.setAccessible(
true
);
m.invoke(obj,
4
);
}
}
|
关于javap工具 。
使用javap命令可以反汇编java的字节码文件,展示class文件中的字段属性、构造方法、普通方法信息; 。
使用说明:
javap java.lang.Object示例 。
javap -c Test示例:
写个简单的Test类,如下:
1
2
3
4
5
6
7
8
9
10
11
|
package
tmp;
class
Simple
{
}
public
class
Test
{
public
static
void
main(String args[])
{
System.out.println(
"Hello"
);
}
}
|
输入javap -c Test
参考资料 。
基本属于翻译,做了小部分修改 。
http://www.javatpoint.com/java-reflection 。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我! 。
原文链接:http://www.cnblogs.com/chenpi/p/6409870.html 。
最后此篇关于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 突破格斗游戏,所以我需要球能够在它击中墙壁
我是一名优秀的程序员,十分优秀!