反射机制的深入应用

1  通过反射调用类中的方法

---------------------------调用无参数方法

 1 public class InstanceDemo {
 2     public static void main(String[] args) {
 3         Class<?> c = null;
 4         try {
 5             c = Class.forName("com.matto.InstanceDemo.Person");
 6         } catch (Exception e) {
 7             e.printStackTrace();
 8         }
 9         try {
10             Method met = c.getMethod("say");        //指定将调用这个没有参数的方法
11             met.invoke(c.newInstance());            //调用方法,必须传递对象实例
12         } catch (Exception e) {
13             e.printStackTrace();
14         }
15
16     }
17 }

---------------------------调用有参数方法

 1 public class InstanceDemo {
 2     public static void main(String[] args) {
 3         Class<?> c = null;
 4         try {
 5             c = Class.forName("com.matto.InstanceDemo.Person");
 6         } catch (Exception e) {
 7             e.printStackTrace();
 8         }
 9         try {
10             Method met = c.getMethod("sayChina",String.class,int.class);        //指定将调用这个有参数的方法
11             String rv = (String)met.invoke(c.newInstance(),"Matto",30);         //调用方法,必须传递对象实例,并传入两个参数
12                                                                                 //此方法的返回值是String类型,故以String接收
13             System.out.println(rv);
14         } catch (Exception e) {
15             e.printStackTrace();
16         }
17
18     }
19 }

2  调用getter与setter方法

 1 public class InstanceDemo {
 2     public static void main(String[] args) {
 3         Class<?> c = null;
 4         Object object = null;
 5         try {
 6             c = Class.forName("com.matto.InstanceDemo.Person");
 7         } catch (Exception e) {
 8             e.printStackTrace();
 9         }
10         try {
11             object = c.newInstance();
12         } catch (Exception e) {
13             e.printStackTrace();
14         }
15         setter(object,"name","Matto",String.class);
16         setter(object,"age",28,int.class);
17         System.out.print("姓名:");
18         getter(object,"name");
19         System.out.print("年龄:");
20         getter(object,"age");
21     }
22
23     //单词首字母大写
24     public static String initStr(String old){
25         String string = old.substring(0,1).toUpperCase() + old.substring(1);
26         return string;
27     }
28
29     /**
30      *
31      * @param object    操作的对象
32      * @param att       操作的属性
33      * @param value     设置的值
34      * @param type      参数类型,就是要设置的值的类型
35      */
36     //调用setter方法
37     public static void setter(Object object,String att,String value,Class<?> type){
38         Method met = null;
39         try {
40             met = object.getClass().getMethod("set" + initStr(att),type);
41             met.invoke(object,value);
42         } catch (Exception e) {
43             e.printStackTrace();
44         }
45     }
46
47     //调用getter方法
48     public static void getter(Object object,String att){
49         try {
50             Method met = object.getClass().getMethod("get" + initStr(att));
51             System.out.println(met.invoke(object,att));                     //接收方法的返回值
52         } catch (Exception e) {
53             e.printStackTrace();
54         }
55     }
56 }

3  通过反射操作属性---此方法不推荐,原因是此方法以扩大类属性的访问权限后直接操作属性。     最好使用上述的 getter和setter方法

 1 public class InstanceDemo {
 2     public static void main(String[] args) {
 3         Class<?> c = null;
 4         Object object = null;
 5         try {
 6             c = Class.forName("com.matto.InstanceDemo.Person");
 7             object = c.newInstance();
 8             //获取属性
 9             Field nameField = c.getDeclaredField("name");
10             Field ageField = c.getDeclaredField("age");
11             //设置可外部访问,并设置值
12             nameField.setAccessible(true);
13             nameField.set(object,"Matto");
14             ageField.setAccessible(true);
15             ageField.set(object,28);
16             //通过get取得属性内容
17             System.out.println("name : " + nameField.get(object));
18             System.out.println("age : " +ageField.get(object));
19
20         } catch (Exception e) {
21             e.printStackTrace();
22         }
23     }
24 }

4  通过反射操作数组:反射机制不仅只能用于类上,还可以应用在任意的引用数据类型的数据上。

------------------得到数组信息并修改数组内容

 1 public class InstanceDemo {
 2     public static void main(String[] args) {
 3         int temp[] = {1,2,3};
 4         Class<?> c = temp.getClass().getComponentType();    //取得数组的Class实例
 5         System.out.println(c.getName());                    //输出数组的名称
 6         System.out.println(Array.getLength(temp));          //取得数组的长度
 7         System.out.println(Array.get(temp,0));              //取得数组的第一个内容
 8
 9         Array.set(temp,0,6);                                //修改数组第一个内容为6
10     }
11 }
时间: 2024-08-30 06:02:04

反射机制的深入应用的相关文章

Android小例子:使用反射机制来读取图片制作一个图片浏览器

效果图: 工程文件夹: 该例子可供于新手参考练习,如果有哪里不对的地方,望指正>-< <黑幕下的人> java代码(MainActivity.java): package com.example.imageswitchtest; import java.lang.reflect.Field; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.v

java反射机制(一)—— 利用反射机制实例化对象

一.Java有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载.探知.使用编译期间完全未知的classes.换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体.或对其fields设值.或唤起其methods.(度娘文库是这么说的) 二.这篇文章主要介绍一下通过反射机制去实例化一个类的对象,然后调用其方法.本文主要介绍两种方式,第一种就是通过构造函数来实例化,第二种就是通过Cl

Java反射机制

Java的反射机制概念 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接.但是反射使用不当会成本很高! 反射的作用 1 可以反编译将class文件编译成java文件 2 可以通过反射机制访问Java对象的属性,方法,构造方法等 反射机制使用步骤 1 得到要调用类的class 2 通过得到的c

【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】

方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; private String name; private Boolean flag; public Integer getNum() { return num; } public void setNum(Integer num) { this.num = num; } public String getNam

使用反射机制调用属性和私有成员与代理模式的介绍

使用反射机制调用属性: 通过反射机制可以获得类的属性,获得到的属性同样的可以进行赋值.得值操作,调用getField方法并传递属性的名称可以获得[学Java,到凯哥学堂kaige123.com]指定的属性,调用getFields方法则可以获得全部属性,但是这种方式不能获得私有属性: 代码示例: Student类示例: 运行结果: 从运行结果可以看出只拿出了公开的属性,私有的属性拿不到. 使用反射机制调用私有成员: 1.调用私有属性 在反射机制里调用私有属性需要通过getDeclaredField

反射机制

反射机制: 反射机制是能够帮助我们把代码变得更加灵活,可扩展性更高,俗称"软编程.软写法".例如:有一个文件里面有一些值,想要把这些值赋值到一个Student类的属性中,按照以前所学到的知识点,只能是通过文件流将文件里的值读取出来,然后再通过set方法将这些值都赋给Student类的属性.但是,这种方式是将代码写死了,在这之后会有一个问题就是如果文件里的内容发生变动,或者要把这个Student类更换成Dog类的话,就要重新修改代码.程序写好了部署到服务器上运行了,总不能时不时就打开来修

Python学习心得(六) 反射机制、装饰器

1.反射机制 #/usr/bin/env python # -*- coding:utf-8 -*- ''' Python反射机制的核心本质:利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动 通俗讲就是通过用户传入url的不同,调用不同的模块函数,好多比较流行的web框架都是通过反射的机制,根据url的不同指向不同的模块 getattr(),hasattr(),setattr(),delattr()对模块的修改都在内存中进行,并不会影响文件中的真实内容

Java 反射机制

使用 Java 反射机制可以在运行时期检查 Java 类的信息,检查 Java 类的信息往往是你在使用 Java 反射机制的时候所做的第一件事情,通过获取类的信息你可以获取以下相关的内容: Class 对象 类名 修饰符 包信息 父类 实现的接口 构造器 方法 变量 注解 除了上述这些内容,还有很多的信息你可以通过反射机制获得,如果你想要知道全部的信息你可以查看相应的文档 JavaDoc for java.lang.Class 里面有详尽的描述. 在本节中我们会简短的涉及上述所提及的信息,上述的

Java的反射机制简述

反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许内部的成员进行操作.虽然这个特性在实际开发中使用的不多,但是像Pascal.C和C++等语言根本没有提供这样的特性.由于反射机制能够实现在运行时对类进行装载,因此能够增加程序的灵活性,但是不恰当地使用反射机制也会严重影响系统的性能. 具体而言,反射机制提供的功能主要有: 1.得到一个对象所属的类: 2.获取一个类的所有成员变量和方法: 3.在运行时创建对象: 4.在运行时调用对象的方法. 其实,反射机制非常重要

Java中的反射机制

Java反射的概念 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制 Java反射机制主要提供下面几种用途: 1.在运行时判断任意一个对象所属的类 2.在运行时构造任意一个类的对象 3.在运行时判断任意一个类所具有的成员变量和方法 4.在运行时调用任意一个对象的方法 首先看一个简单的例子,通过这个例子来理解Java的反射机制是如何工作的 i