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

通过反射调用类中的方法

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)); //得到第一个内容
} }

Java反射机制<2>的更多相关文章

  1. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  2. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

  3. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  4. java基础知识(十一)java反射机制(下)

    1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...

  5. Java反射机制专题

    ·Java Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方 ...

  6. java反射机制深入详解

    java反射机制深入详解  转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...

  7. Java反射机制DOME

    Java反射机制 public class TestHibernate { @Test public void TestHb(){ try { Class cs = Class.forName(&qu ...

  8. 反射——Java反射机制

    反射概述 什么是反射? ①   反射的概念是由Smith在1982年首次提出的,主要指程序可以访问.检测和修改它本身状态或行为的一种能力. ②   JAVA反射机制是在运行状态中,对应任意一个类,都能 ...

  9. Java反射机制可以动态修改实例中final修饰的成员变量吗?

    问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. ...

  10. Java反射机制学习与研究

    Java反射机制:可以获取正在运行时的Java对象. 1.判断运行时对象对象所属的类. 2.判断运行时对象所具有的成员变量和方法. 3.还可以调用到private方法,改变private变量的值. S ...

随机推荐

  1. 安卓 Context 和 Application的关系

    1. 我开始一直不理解显式Intent中传一个this(当前的activity)是为什么.因为Intent里面的构造方法对应的只有 Context, Class.后面查资料才发现 Intent i = ...

  2. LVS + Keepalived + Nginx安装及配置

    1.概述 上篇文章<架构设计:负载均衡层设计方案(6)——Nginx + Keepalived构建高可用的负载层>(http://blog.csdn.net/yinwenjie/artic ...

  3. 了解ASP.NET MVC几种ActionResult的本质:JavaScriptResult & JsonResult

    在之前的两篇文章(<EmptyResult & ContentResult>和<FileResult>)我们剖析了EmptyResult.ContentResult和F ...

  4. 【BZOJ 2152】聪聪可可 点分治

    对于一棵树,fdrt找到重心,然后分治每个子树. 在一棵以重心为根的树上,符合条件的链是: 1.过重心(根) 2.不过重心 对于1我们只需dfs出距离重心(根)的距离然后统计再减去有重叠的边 对于2我 ...

  5. cookie的写入与读出

    cookie在jquery中有指定的cookie操作类 $.cookie('the_cookie'); // 读取 cookie $.cookie('the_cookie', 'the_value') ...

  6. SQL Server 自增字段重置

    --- 删除原表数据,并重置自增列 truncate table tablename --truncate方式也可以重置自增字段 --重置表的自增字段,保留数据 DBCC CHECKIDENT (ta ...

  7. perl 哈希 连接符

    #!/usr/bin/perl -w use strict; my $test_1 = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; my $test_2 ...

  8. BZOJ1912 [Apio2010]patrol 巡逻

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  9. eclipse安装插件的方法(简单、ERMaster插件安装)

    ERMaster插件:https://sourceforge.net/projects/ermaster/ 链接:http://pan.baidu.com/s/1o7UWLMa 密码:wkax 可以编 ...

  10. android备忘录

    1.跑马灯-滚动字幕 多用于广告,在屏幕上方滚动显示,可以是文字,图片等 #滚动字幕 TextView 中加(singleLine="true",ellipsize="m ...