Java反射机制实例解析
1、获取想操作的访问类的java.lang.Class类的对象
2、调用Class对象的方法返回访问类的方法和属性信息
3、使用反射API来操作
每个类被加载后,系统会为该类生成一个对应的Class对象,通过该Class对象就可以访问到Java虚拟机中的这个类,Java程序中获取Class对象通常有如下三种方式:
1、调用某个对象的getClass()方法,是Object中的一个方法,所以所有类都可以调用这个方法
Person p= new Person();
Class cla = p.getClass();
2、调用某个类的class属性来获取该类对应的Class对象
Class cla = Person.class;
不过这种方法是要在编译阶段都要知道类的名称
3、使用Class类的forName()静态方法
该方法需要传入字符串参数,该字符串参数的值是某个类的全名,例如
//用户输入类的全路径
//JOptionPane 有助于方便地弹出要求用户提供值或向其发出通知的标准对话框
String classpath = JOptionPane.showInputDialog(null, "输入类的全路径"); //根据类的全路径进行类加载,运回该类的Class对象
Class class1= Class.forName(classpath);
上面一定要填完整的包名,否则会抛出一个ClassNotFoundException异常
总结:2、3都是调用某个class方法来获取该类对应的Class对象,
代码更安全,程序在编译阶段,就要检查所访问的Class对象是否存在
程序性能更高,因为这2种方式无须调用方法,所以程序的性能更好,大部分我们都应该使用调用getClass()来获取该类的Class对象
实例:
Person.java
package com.pb.reflect.classinfo;
public class Person {
private String name;
private String gender;
private int age;
public String getName() {
return name;
}
private void setName(String name) {
this.name = name;
}
private String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString(){
return "姓名是:"+name+",年龄是:"+age;
}
}
ReflectAction.java
package com.pb.reflect.classinfo; import java.lang.reflect.Field;
import java.lang.reflect.Method; import javax.swing.JOptionPane; //通过用户输入类的全路径,获取该类的成员方法和成员属性
public class ReflectAction {
/* 获取Class对象方式一
* 构造方法,通过class.forName()方法获取Class对象
*/
public ReflectAction(){
//用户输入类的全路径
//JOptionPane 有助于方便地弹出要求用户提供值或向其发出通知的标准对话框
String classpath = JOptionPane.showInputDialog(null, "输入类的全路径");
try {
//根据类的全路径进行类加载,运回该类的Class对象
Class class1= Class.forName(classpath);
//通过Class对象的class1的自审,返回方法对象集合
Method[] methods = class1.getMethods();
//便利methods数组,并输出方法信息
System.out.println("#######获取方法信息##########");
for(Method meth:methods){
System.out.println(meth.toString());
}
System.out.println("#######获取方法信息结束##########");
//利用Class对象class1的自审,返回成员属性对象集合 Field[] fields = class1.getDeclaredFields();
//便利fields数组,并输出属性信息
System.out.println("#######获取属性信息##########");
for(Field field:fields){
System.out.println(field.toString());
}
System.out.println("#######获取属性信息结束##########");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/*
* 获取Class对象方式二:使用对象的getClass()方法
*/
public ReflectAction(Person p){
Class class1 = p.getClass();
//通过Class对象的class1的自审,返回方法对象集合
Method[] methods = class1.getMethods();
//便利methods数组,并输出方法信息
System.out.println("#######获取方法信息##########");
for(Method meth:methods){
System.out.println(meth.toString());
}
System.out.println("#######获取方法信息结束##########");
//利用Class对象class1的自审,返回成员属性对象集合 Field[] fields = class1.getDeclaredFields();
//便利fields数组,并输出属性信息
System.out.println("#######获取属性信息##########");
for(Field field:fields){
System.out.println(field.toString());
}
System.out.println("#######获取属性信息结束##########");
} }
TestReflection.java
package com.pb.reflect.classinfo; import java.lang.reflect.Field;
import java.lang.reflect.Method; public class TestReflection {
public static void main(String[] args) {
/*第一种方式运行代码:
*
ReflectAction rf = new ReflectAction();*/ /*第二种方式运行代码:
* Person p=new Person();
ReflectAction rf = new ReflectAction(p);*/ /*
* 获取Class对象方式三,通过类的class属性获取
*
*/
Class class1 = Person.class;
//通过Class对象的class1的自审,返回方法对象集合
Method[] methods = class1.getMethods();
//便利methods数组,并输出方法信息
System.out.println("#######获取方法信息##########");
for(Method meth:methods){
System.out.println(meth.toString());
}
System.out.println("#######获取方法信息结束##########");
//利用Class对象class1的自审,返回成员属性对象集合 Field[] fields = class1.getDeclaredFields();
//便利fields数组,并输出属性信息
System.out.println("#######获取属性信息##########");
for(Field field:fields){
System.out.println(field.toString());
}
System.out.println("#######获取属性信息结束##########");
}
}
推荐使用第3种方法
Java反射机制实例解析的更多相关文章
- Java反射机制(Reflect)解析-----https://www.cnblogs.com/fzz9/p/7738381.html
Java反射机制(Reflect)解析-----https://www.cnblogs.com/fzz9/p/7738381.html
- Java反射机制(Reflect)解析
一.导读 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计 ...
- java反射机制实例
1.通过数据库字段反射给对象实例赋值 convertClass.java /** * 通过反射构造对象 * @param obj * @param rs * @return */ public Obj ...
- Java 基础之详解 Java 反射机制
一.什么是 Java 的反射机制? 反射(Reflection)是Java的高级特性之一,是框架实现的基础,定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: ...
- [转]Java反射机制详解
目录 1反射机制是什么 2反射机制能做什么 3反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实例化Class类对象 ·获取一个对象的父类与实现的接口 ·获取某个类中的全部构造函数 - 详 ...
- 【转载】Java反射机制详解
转自:http://baike.xsoftlab.net/view/209.html#3_8 1反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对 ...
- Java知识总结:Java反射机制(用实例理解)
概念理解: 反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来 实现对自己行为的描述( self-representation )和检测( examination) ,并能 ...
- Java反射机制可以动态修改实例中final修饰的成员变量吗?
问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. ...
- java反射机制简单实例
目录 Java反射 简单实例 @(目录) Java反射 Java语言允许通过程序化的方式间接对Class进行操作.Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通 ...
随机推荐
- Python2.2-原理之类型和运算
此节来自于<Python学习手册第四版>第二部分 一.Python对象类型(第4章) 1. Python可以分解成模块.语句.表达式以及对象:1.程序由模块构成:2.模块包含语句:3.语句 ...
- c#邮件发送的实现
第一步 :引用命名空间 using System.Net; using System.Net.Mail; 第二步:具体代码 //创建邮箱信息 MailMessage myMail = new Mail ...
- 用 Smarty 生成静态页面入门介绍
why Smarty? 随着公司首页(以下简称首页)流量越来越大,最近开始考虑使用后台语言生成静态页面的技术. 我们知道,一个简单页面一般是一个 .html(或者 .htm ..shtml)后缀的文件 ...
- 大新闻!HoloLens即将入华商用
昨天微软搞了大新闻,Terry和Alexi到了深圳,在WinHEC大会上宣布了2017上半年HoloLens正式入华商用. 关于HoloLens的技术原理和细节官方文档和报道已经披露很多了,他是一款真 ...
- 遇到技嘉 Gigabyte UEFI DualBIOS问题
我的板子是技嘉H87-D3H二手板子,用了差不多三年左右,一直感觉不错,承担着高强度的开发任务. 问题描述: 无法开机,按下电源后,主板通电状态灯亮,CPU和显卡风扇转动,显示器显示下图: 2至3秒后 ...
- N-gram模型
n元语法 n-gram grammar 建立在马尔可夫模型上的一种概率语法.它通过对自然语言的符号串中n个符号同时出现概率的统计数据来推断句子的结构关系.当n=2时,称为二元语法,当 ...
- 网页设计:Meta标签详解
很多人忽视了HTML标签META的强大功效,一个好的META标签设计可以大大提高你的个人网站被搜索到的可能性,有兴趣吗,谁我来重新认识一下META标签吧! META标签是HTML语言HEAD区的一个辅 ...
- canvas缓动2
同之前的缓动原理.这里将终点换成鼠标,做出跟随效果 var canvas = document.getElementById("canvas"); var cxt=canvas.g ...
- Java--笔记(5)
41.面向对象的五大基本原则 (1)单一职责原则(SRP) (2)开放封闭原则(OCP) (3)里氏替换原则(LSP) (4)依赖倒置原则(DIP) (5)接口隔离原则(ISP) 单一职责原则(SRP ...
- android 点亮屏幕与锁定屏幕
PowerManager pm=(PowerManager) getSystemService(Context.POWER_SERVICE); //获取电源管理器对象 PowerManager.Wak ...