博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java反射机制<2>
阅读量:6849 次
发布时间:2019-06-26

本文共 4862 字,大约阅读时间需要 16 分钟。

反射机制还可以调用类中的指定方法或指定属性,并且可以通过反射完成对数组的操作。

 

通过反射调用类中的方法

import java.lang.reflect.Method;//=================================================// File Name       :	InvokeChina_demo//------------------------------------------------------------------------------// Author          :	Common//主类//Function        : 	InvokeChina_demo;public class InvokeChina_demo {	public static void main(String[] args) {		// TODO 自动生成的方法存根		Class
c1 = null; //指定泛型 try{ c1 = Class.forName("Person_5"); //传入要实例化类的完整包.类名称 }catch(ClassNotFoundException e){ e.printStackTrace(); } try{ Method met = c1.getMethod("sayChina"); //取得一个Method对象 met.invoke(c1.newInstance()); //使用invoke进行调用,必须传递对象实例 }catch(Exception e){ e.printStackTrace(); } }}

 

可以向方法中传递两个参数

import java.lang.reflect.Method;//=================================================// File Name       :	InvokeChina_demo//------------------------------------------------------------------------------// Author          :	Common//主类//Function        : 	InvokeChina_demo;public class InvokeChina_demo {	public static void main(String[] args) {		// TODO 自动生成的方法存根		Class
c1 = null; //指定泛型 try{ c1 = Class.forName("Person_5"); //传入要实例化类的完整包.类名称 }catch(ClassNotFoundException e){ e.printStackTrace(); } try{ Method met = c1.getMethod("sayHello",String.class,int.class); //此方法需要两个参数 String rv = null; //接收方法的返回值 rv = (String)met.invoke(c1.newInstance(),"李四",32); //使用invoke进行调用,必须传递对象实例 System.out.println(rv); }catch(Exception e){ e.printStackTrace(); } }}

 

调用setter和getter方法

import java.lang.reflect.Method;//=================================================// File Name       :	InvokeSetGet_demo//------------------------------------------------------------------------------// Author          :	Common//主类//Function        : 	InvokeSetGet_demo;public class InvokeSetGet_demo {	public static void main(String[] args) {		// TODO 自动生成的方法存根		Class
c1 = null; //指定泛型 Object obj = null; //声明一个对象 try{ c1 = Class.forName("Person_5"); //传入要实例化类的完整包.类名称 }catch(ClassNotFoundException e){ e.printStackTrace(); } try{ obj = c1.newInstance(); //实例化操作对象 }catch(InstantiationException | IllegalAccessException e){ e.printStackTrace(); } setter(obj, "name", "张三", String.class); setter(obj, "age", 25, int.class); System.out.println("姓名:"); getter(obj, "name"); System.out.println("年龄:"); getter(obj, "age"); } public static void setter(Object obj,String att,Object value,Class
type){ try{ Method met = obj.getClass().getMethod("set"+initStr(att),type); //设置方法参数类型 met.invoke(obj, value); //调用方法 }catch(Exception e){ e.printStackTrace(); } } public static void getter(Object obj,String att){ try{ Method met = obj.getClass().getMethod("get"+initStr(att)); System.out.println(met.invoke(obj)); //接收方法的返回值 }catch(Exception e){ e.printStackTrace(); } } public static String initStr(String old){ String str = old.substring(0, 1).toUpperCase()+old.substring(1); //首字母大写 return str; }}

 

直接操作类中的属性

import java.lang.reflect.Field;//=================================================// File Name       :	InvokeField_demo//------------------------------------------------------------------------------// Author          :	Common//主类//Function        : 	InvokeField_demo;public class InvokeField_demo {	public static void main(String[] args) throws Exception {		// TODO 自动生成的方法存根		Class
c1 = null; //声明Class对象 Object obj = null; //声明一个对象 c1 =Class.forName("Person_5"); //实例化Class对象 obj = c1.newInstance(); //实例化对象 Field nameField = null; //表示name属性 Field ageField = null; //表示age属性 nameField = c1.getDeclaredField("name"); //取得name属性 ageField = c1.getDeclaredField("age"); //取得age属性 nameField.setAccessible(true); //将name属性设置成可被外部访问 nameField.set(obj, "张三"); //设置name属性内容 ageField.setAccessible(true); //将age属性设置成可被外部访问 ageField.set(obj, 33); //设置age属性内容 System.out.println("姓名:"+nameField.get(obj)); //通过get取得属性内容 System.out.println("年龄:"+ageField.get(obj)); }}

 

 

通过反射操作数组

import java.lang.reflect.Field;import java.lang.reflect.Array;//=================================================// File Name       :	InvokeField_demo//------------------------------------------------------------------------------// Author          :	Common//主类//Function        : 	InvokeField_demo;public class InvokeField_demo {	public static void main(String[] args) throws Exception {		// TODO 自动生成的方法存根				int temp[] = {1,2,3};		Class
c = temp.getClass().getComponentType(); //取得数组的Class对象 System.out.println("类型:"+c.getName()); //得到数组类型名称 System.out.println("长度:"+Array.getLength(temp)); //得到数组长度 System.out.println("第一个内容:"+Array.get(temp,0)); //得到第一个内容 Array.set(temp,0,6); //修改第一个内容 System.out.println("第一个内容:"+Array.get(temp,0)); //得到第一个内容 }}

 

转载地址:http://kxrul.baihongyu.com/

你可能感兴趣的文章
在windows(64)下安装php开发环境wamp+yaf框架+phpstorm以及TortoiseGit
查看>>
淘宝的IP地址库
查看>>
ORACLE 建库过程总结
查看>>
Comparable与Comparator的区别(转载)
查看>>
我的友情链接
查看>>
window下从硬盘安装ubuntu双系统
查看>>
socket服务器与客户机的互动
查看>>
三种方法实现选项卡效果
查看>>
API网关(API Gateway)
查看>>
Zookeeper集群搭建和简单使用
查看>>
IntelliJ IDEA快捷键
查看>>
Xmanager 连接 AIX 系统
查看>>
java的锁机制
查看>>
如何避免项目管理黑洞-为什么要使用redmine
查看>>
[]+与[]表达式
查看>>
.Net平台下ActiveMQ入门实例
查看>>
C#语言获取控制面板“程序和功能”列表
查看>>
外网语音通信准备资料
查看>>
写字机器人开发之:python opencv linux下合作操作摄像头
查看>>
if-else选择结构
查看>>