# 详解Java反射各种应用
Java除了给我们提供在编译期得到类的各种信息之外,还通过反射让我们可以在运行期间得到类的各种信息。通过反射获取类的信息,得到类的信息之后,就可以获取以下相关内容:
- Class对象
- 构造器
- 变量
- 方法
- 私有变量与私有方法
- 注解
- 泛型
- 数组
本文也将从上面几个方面来介绍Java反射。本文涉及的所有代码均在[反射代码](https://github.com/byhieg/JavaTutorial/tree/master/src/main/java/cn/byhieg/reflectiontutorial)
首先放出一个Java类作为反射的研究对象,类的内容如下:
```
public abstract class FatherObject implements Runnable{
public void doSomething(){
System.out.println("做事情......");
}
}
public class ExampleObject extends FatherObject{
public int age = 30;
public String name = "byhieg";
private Integer score = 60;
public void printName(){
System.out.println(name);
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
}
public ExampleObject(){
}
public ExampleObject(String name){
}
public ExampleObject(int age,Integer score){
}
@Override
public void doSomething() {
super.doSomething();
}
@Override
public void run() {
System.out.println("run......");
}
}
```
## Class对象
我们应用会用到反射这个知识点,肯定是想要在运行时得到类的信息,根据类的那些信息去做一些特定的操作。那么,首先无疑就是得到类的信息,在JDK中提供了Class对象来保存类的信息。所以,反射的第一步就是得到Class对象。在JDK中提供了两种方式得到Class对象。
第一种,如果编写代码的时候,就知道Class的名字,可以直接用如下方式得到Class对象:
```
Class exampleObjectClass = ExampleObject.class;
```
第二种,如果在编写代码的时候,不知道类的名字,但是在运行时的时候,可以得到一个类名的字符串,可以用如下的方式获取Class对象:
```
Class exampleObjectClass = Class.forName("cn.byhieg.reflectiontutorial.ExampleObject");
```
注意,此方法需要有2个条件,第一,forName中的字符串必须是全限定名,第二,这个Class类必须在classpath的路径下面,因为该方法会抛出`ClassNotFoundException`的异常。
获取到这个Class对象之后,就可以得到类的各种信息,开头已经提及了一些信息,下面,说几个没提到的类的信息。
### 得到类的名字
类的名字有两种方式得到,一种是getName(),一种是getSimpleName()。第一种得到的是全限定名,第二种得到的是这个类的名字,不带包名。看下面的例子:Class对象,已经通过上面的代码得到了。
```
String fullClassName = exampleObjectClass.getName();
String simpleClassName = exampleObjectClass.getSimpleName();
System.out.println(fullClassName);
System.out.println(simpleClassName);
```
结果如下:
```
cn.byhieg.reflectiontutorial.ExampleObject
ExampleObject
```
### 得到类的包名、父类和实现的接口
类的包名和父类,可以通过如下代码得到。
```
//得到包信息
Package aPackage = exampleObjectClass.getPackage();
System.out.println(aPackage);
//得到父类
Class superClass = exampleObjectClass.getSuperclass();
System.out.println(superClass.getSimpleName());
```
结果如下:
```
package cn.byhieg.reflectiontutorial
FatherObject
```
很显然,得到父类的返回值也是一个Class对象,那么可以利用这个对象得到父类的一些信息,比如判断父类是不是抽象类
```
System.out.println("父类是不是抽象类 " + Modifier.isAbstract(superClass.getModifiers()));
```
getModifiers可以得到类的修饰符,从而得到类的修饰符,当然,这个getModifiers不仅仅Class对象可以调用,Method对象可以调用。
可以使用java.lang.reflect.Modifier类中的方法来检查修饰符的类型:
```
Modifier.isAbstract(int modifiers);
Modifier.isFinal(int modifiers);
Modifier.isInterface(int modifiers);
Modifier.isNative(int modifiers);
Modifier.isPrivate(int modifiers);
Modifier.isProtected(int modifiers);
Modifier.isPublic(int modifiers);
Modifier.isStatic(int modifiers);
Modifier.isStrict(int modifiers);
Modifier.isSynchronized(int modifiers);
Modifier.isTransient(int modifiers);
Modifier.isVolatile(int modifiers);
```
此外,我们还可以得到父类实现的接口
```
//得到接口
Class[] classes = superClass.getInterfaces();
System.out.println("父类的接口" + classes[0]);
```
因为Java类可以实现很多接口,所以用的数组,但在实际使用的时候,需要先判断数组的长度。
下面,重点讲解上述列出来的内容。
## 构造器
利用Java反射可以得到一个类的构造器,并根据构造器,在运行时动态的创建一个对象。首先,Java通过以下方式获取构造器的实例:
```
//构造器
Constructor[] constructors = exampleObjectClass.getConstructors();
for (Constructor constructor : constructors){
System.out.println(constructor.toString());
}
```
结果如下:
```
public cn.byhieg.reflectiontutorial.ExampleObject(int,java.lang.Integer)
public cn.byhieg.reflectiontutorial.ExampleObject(java.lang.String)
public cn.byhieg.reflectiontutorial.ExampleObject()
```
如果,事先知道要访问的构造方法的参数类型,可以利用如下方法获取指定的构造方法,例子如下:
```
Constructor constructor = exampleObjectClass.getConstructor(String.class);
System.out.println(constructor.toString());
```
结果显然是:
```
public cn.byhieg.reflectiontutorial.ExampleObject(java.lang.String)
```
还可以用如下方式得到另一个构造器
```
Constructor constructor = exampleObjectClass.getConstructor(int.class,Integer.class);
System.out.println(constructor.toString());
```
此外,如果我们不知道构造器的参数,只能得到所有的构造器对象,那么可以用如下方式得到每一个构造器对想的参数:
```
Constructor[] constructors = exampleObjectClass.getConstructors();
for (Constructor constructor : constructors){
Class[] parameterTypes = constructor.getParameterTypes();
System.out.println("构造器参数如下========================");
for (Class clz : parameterTypes){
System.out.println("参数类型 " + clz.toString());
}
}
```
结果如下:
```
构造器参数如下========================
参数类型 class java.lang.String
构造器参数如下========================
参数类型 int
参数类型 class java.lang.Integer
```
这里,可以看出无参构造方法,是不打印出结果的。基本类型的Class对象和引用类型的Class对象toString()方法是不一样的。
现在,可以根据构造器的各种信息,动态创建一个对象。
```
Object object = constructor.newInstance(1,100);
System.out.println(object.toString());
```
这个创建对象的方式有2个条件,第一是通过有参构造器创建的,第二,构造器对象必须通过传入参数信息的getConstructor得到。
第一个条件,对于无参构造方法就可以创建的对象,不需要得到构造器对象,直接Class对象调用newInstance()方法就直接创建对象。
第二个条件,构造器对象必须通过`exampleObjectClass.getConstructor(String.class);`这种形式得到。如果通过`getConstructors`得到构造器数组,然后调用
没有合适的资源?快使用搜索试试~ 我知道了~
Java学习源码Java多线程的代码
共278个文件
java:260个
md:10个
txt:2个
需积分: 0 0 下载量 21 浏览量
2023-06-15
09:44:19
上传
评论
收藏 536KB RAR 举报
温馨提示
在char01包里放置Java多线程基本知识的代码。内容如下: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 在char02包里放置了Java对变量和对象并发访问的知识的代码。内容如下: 对于方法的同步处理 对于语句块的同步处理 对类加锁的同步处理 保证可见性的关键字——volatile 在char03包里放置了Java线程间通信的知识的代码。内容如下: 等待/通知机制 join方法的使用 在char04包里放置了Java中Lock类的知识的代码,内容如下: Lock类 Lock类其他功能 Condition类 Condition类其他功能 读写锁 在char05包里放置了生产者/消费者的知识的代码,内容如下: 一对一 生产者/消费者 一对多 生产者/消费者 多对多 生产者/消费者
资源推荐
资源详情
资源评论
收起资源包目录
Java学习源码Java多线程的代码 (278个子文件)
Thumbs.db 11KB
.gitignore 1KB
javaturorial.iml 943B
Sort.java 10KB
RedBlackTree.java 9KB
BinarySearchTree.java 9KB
BinaryTree.java 7KB
GraphMatrix.java 6KB
APTProcessor.java 5KB
ExampleObjectTest.java 4KB
SimpleLinkedList.java 4KB
TreeMapExample.java 3KB
SimpleArrayList.java 3KB
AnnotationObjectTest.java 3KB
AtomFactoryTest.java 2KB
BinaryTreeTest.java 2KB
GenericObjectTest.java 2KB
SingleLinkList.java 2KB
ConditionAllService.java 2KB
Find.java 2KB
SingleLinkListTest.java 2KB
OutClass.java 2KB
SimpleDialog.java 2KB
SimpleDialogController.java 2KB
More2moreValueTest.java 2KB
BinarySearchTreeTest.java 2KB
GraphMatrixTest.java 2KB
Person.java 1KB
StaticService.java 1KB
MyConditionMoreService.java 1KB
LongTimeServiceThreadATest.java 1KB
DeadLock.java 1KB
SimpleLinkedListTest.java 1KB
SortTest.java 1KB
ByteArrayInputStreamExample.java 1KB
WriteReadService.java 1KB
WaitHasParamThread.java 1KB
ReadWriteService.java 1KB
AMethodProcess.java 1KB
MyQueue.java 1KB
AConstructorProcess.java 1KB
AliveOtherThread.java 1KB
MyQueue.java 1KB
MyQueue.java 1KB
MyQueue.java 1KB
TreeMapExampleTest.java 1KB
AddSubTest.java 1KB
Service.java 1KB
ConditionWaitNotifyService.java 1KB
HalfSynTask.java 1KB
One2oneValueTest.java 1KB
ExampleObject.java 1022B
More2moreListTest.java 1013B
MyObject.java 984B
ExceptionService.java 961B
ExampleSuspendThreadTest.java 959B
SynBlockService.java 959B
LongTimeTask.java 951B
CommonTest.java 949B
HashMapExample.java 933B
InnerClass1Test.java 899B
LinkedHashMapExample.java 891B
MyConditionMoreServiceTest.java 885B
PublicVar.java 885B
AtomFactory.java 873B
ArrayBlockTest.java 869B
MyConditionServiceTest.java 863B
ArrayBlock.java 863B
FileOutputStreamExampleTest.java 862B
NotifyThread.java 861B
ByteArrayInputStreamExampleTest.java 844B
FindTest.java 834B
ArrayListDemoTest.java 828B
ObjectService.java 823B
ExamplePriorityThreadTest.java 819B
SynchronizedObject.java 818B
Subtract.java 817B
More2oneListTest.java 797B
Producer.java 795B
PrintString.java 793B
One2moreListTest.java 789B
ComplexCurrentThread.java 787B
Costumer.java 772B
StopLockThreadTest.java 770B
HasSelfPrivateNumTest.java 767B
RunServiceTest.java 759B
WaitThread.java 755B
Customer.java 754B
ObjectServiceTest.java 746B
ByteArrayOutPutStreamExample.java 740B
SynBlockServiceTest.java 735B
Producer.java 735B
FairServiceTest.java 733B
WriteWriteService.java 730B
HoldCountService.java 726B
JoinThreadB.java 720B
ReadReadService.java 719B
ArrayObject.java 711B
BufferdOutputStreamExample.java 701B
ArrayListDemo.java 700B
共 278 条
- 1
- 2
- 3
资源评论
paterWang
- 粉丝: 1060
- 资源: 1206
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功