java的反射在java中是一项很有用的功能,hibernate和spring中都使用了该功能。为了方便大家理解java的反射,下面我写了一个简单的例子,希望对大家的学习有所帮助!
实现反射的类主要包括以下几个:
1、Class 表示一个类的类
2、Field 表示属性的类
3、Method 表示方法的类
4、Constrctor 表示类的构造方法的类
Class类位于java.lang包中,后面三个类都位于java.lang.reflect包中。
下面请看例子,注释在程序中:
/**
* @description 这是java反射的演示示例,本程序完成的功能是复制一个简单的bean对象。假定bean对象的每个属性都有getXxx()和setXxx()方法。
* @author fangjian 2008.06.11
*/
import java.lang.reflect.*;
public class ReflecTester {
public Object copy(Object object) throws Exception
{
//Class类是java反射中的核心类,有几个常用方法:
//1、getName() 以String形式返回类的名称
//2、getFields()返回所有public类型的属性
//3、getField(String name)返回指定名称的属性对象
//4、getDeclaredFields() 以数组形式返回类的所有属性对象
//5、getMethod(String name, Class[] parameterTypes) 返回指定的方法对象,name表示方法名称,parameterTypes表示参数类型
//6、getConstructors()获得默认的构造方法
//7、getConstructor(Class[] parameterTypes)获得特定的构造方法,parameterTypes为构造方法的参数类型
//获得传入的对象的类型(getClass()方法用于获得对象的类型,它是在Object类中定义的,因此任何对象都可以调用)
Class classType=object.getClass();
System.out.println(classType.getName());
//根据传入对象的类型,构造一个新的对象
Object objectCopy=classType.newInstance();
//取得传入的对象的所有属性,本例包括name和age
Field fields[]=classType.getDeclaredFields();
//遍历每个属性
for(int i=0;i<fields.length;i++)
{
//取得一个属性对象
Field field=fields[i];
//取得属性的名字,例如:name
String fieldName=field.getName();
//取得属性名称的第一个字母,然后转换成大写,例如:N
String firstChar=fieldName.substring(0, 1).toUpperCase();
//构造一个get方法名,例如:getName
String getMethodName="get"+firstChar+fieldName.substring(1);
//构造一个set方法名,例如:setName
String setMethodName="set"+firstChar+fieldName.substring(1);
//根据方法的名字,取得Method对象,下面两行语句分别取得了get和set方法对象
Method getMothod=classType.getMethod(getMethodName, new Class[]{});
Method setMothod=classType.getMethod(setMethodName, new Class[]{field.getType()});
//Method对象的invoke方法,用于动态的执行指定对象的方法。它的第一个参数表示拥有该方法的对象,第二个
//参数表示该方法的参数
//根据传入的对象及其相应的方法对象,就可以调用get方法对象取得相应的属性值了,例如:zhaona
Object value=getMothod.invoke(object, new Object[]{});
//根据新构造的对象,调用set方法对象,就可以为其设置相应的属性值了,例如:zhaona
setMothod.invoke(objectCopy, new Object[]{value});
}
return objectCopy;
}
public static void main(String[] args)
{
//新建一个bean类,并设置值
TestBean tb=new TestBean();
tb.setName("zhaona");
tb.setAge(26);
//实例化当前类
ReflecTester rt=new ReflecTester();
try {
//执行copy方法,将新建的bean类传入
TestBean tbCopy=(TestBean)rt.copy(tb);
//测试返回的类的各个属性是否与原类一致
System.out.print(tbCopy.getName()+"-----"+tbCopy.getAge());
} catch (Exception e) {
e.printStackTrace();
}
}
}
//测试使用的类
class TestBean{
String name;
int age;
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
}
分享到:
相关推荐
`Reject` 是一个专为Java和Android开发设计的轻量级依赖注入(Dependency Injection,简称DI)框架。依赖注入是一种软件设计模式,它可以帮助开发者解耦组件,使得代码更易于测试和维护。通过将依赖关系从对象内部...
- 通常,Java Radius客户端库会封装基本的网络通信细节,提供API来构建和解析Radius报文,包括认证请求(Access-Request)、认证响应(Access-Accept/Reject)等。 3. **源代码分析**: - 源代码中可能包含用于...
- 如果消息为 `/reject`,则提示连接被拒绝,并恢复界面状态。 - 如果消息以 `/peer` 开头,则设置对手的信息和当前颜色(此处仅展示了部分代码)。 ### 技术要点 1. **多线程**:通过继承 `Thread` 类来实现多...
3. **/reject**:如果客户端尝试加入或创建一个已经满员的游戏,服务器将发送此命令。 - 显示错误信息。 - 关闭游戏按钮,并重新启用“加入游戏”和“创建游戏”按钮。 4. **/peer**:当客户端收到此命令时,表示...
- 游戏拒绝:`/reject`命令表示用户尝试加入的游戏已被拒绝,客户端将更新状态并重新启用游戏控制按钮。 - 对手信息:`/peer`命令告知客户端其对手的名称,进一步初始化游戏状态。 #### 3. **网络通信机制** 本...
7. **调试与测试**:对于给定的DFA,通过提供不同输入序列(accept和reject trace)进行测试,可以帮助确保程序正确地实现了自动机的行为。 通过理解和实现DFA的Java程序,你可以深入理解形式语言的理论,并学习...
throw new RejectedExecutionException("command is too much, reject execute"); } private void addThread(Runnable task) { // 为代码健壮性考虑,常规参数校验 if (task == null) throw new ...
### Java网络五子棋源代码解析 #### 一、项目概述 本项目为一个基于Java语言实现的网络五子棋游戏。它通过客户端与服务器之间的通信来实现多人在线对弈的功能。该程序主要包括以下几个核心部分:`chessClient.java...
《五子棋Java源代码解析》 五子棋是一种经典的双人对弈游戏,而将它实现为Java程序,能够帮助我们深入理解网络编程、图形用户界面(GUI)设计以及多线程等核心Java概念。这里我们将分析一个简单的五子棋Java源代码...
主要介绍了Java中有界队列的饱和策略(reject policy)原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
- 如果接收到的消息为 `/reject`,则显示无法加入游戏的信息。 - 如果接收到的消息以 `/peer` 开头,则获取对战对手的名称,并根据客户端的角色(服务器或客户端)设置游戏状态。 ##### 2. chessInterface.java ...
- 在文件中找到`-A INPUT -j REJECT --reject-with icmp-host-prohibited`这一行,并在其上方添加: ```bash -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT ``` - 重启防火墙使新规则...
- 如果消息为 `/reject`,则提示用户无法加入游戏。 - 更新状态栏文本,禁用某些按钮。 - 如果消息以 `/peer` 开始,则设置对手的名称。 - 提取对手名称,并进行相应的逻辑处理。 ##### 2. **chessInterface....
- 收到 `/reject` 消息时,表明游戏请求被拒绝,此时会禁用某些控制按钮并提示用户。这一机制可以确保用户了解当前的游戏状态。 2. **游戏逻辑处理**: - 当收到 `/peer` 消息时,游戏会根据当前的角色(服务器端...
如果收到`/reject`,则表示加入游戏的请求被拒绝,并更新用户界面;而`/peer`消息则指示了对手的名称。 2. **chessinterface.java** - 客户端界面 此文件包含客户端的图形用户界面(GUI)实现,可能包括棋盘、聊天...
return Promise.reject(error); }); ``` 6. **错误处理**:如上所示,Axios的`.catch`方法可以捕获请求错误。在复杂的场景下,可以使用`.then`链式调用来处理不同的响应状态。 7. **使用Vue插件**:Vue社区还...
- 如果接收到的消息为`/reject`,则显示拒绝信息并重新启用创建和加入游戏按钮。 - 如果接收到的消息以`/peer`开头,则处理对手的信息。 #### 2. `chessServer.java` - **功能**: 服务端主类,负责接收客户端连接...
else if(recMessage.equals("/reject")) { try { chessclient.chesspad.statusText.setText("不能加入游戏"); chessclient.controlpad.cancelGameButton.setEnabled(false); chessclient.controlpad....
} else if (recMessage.equals("/reject")) { // 处理拒绝连接的情况 // ... } else if (recMessage.startsWith("/peer")) { // 设置对手名称等信息 // ... } } } ``` ##### 2. `chessServer.java` - **...
例如,当服务器发送`/reject`消息时,客户端会更新界面状态,禁用某些按钮并显示相应提示。 8. **并发控制**:由于可能存在多个客户端同时操作,因此需要考虑并发控制,确保数据的一致性和正确性。这可能涉及到同步...