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结构的元信息对象,通 ...
随机推荐
- JavaScript中sort方法的一个坑(leetcode 179. Largest Number)
在做 Largest Number 这道题之前,我对 sort 方法的用法是非常自信的.我很清楚不传比较因子的排序会根据元素字典序(字符串的UNICODE码位点)来排,如果要根据大小排序,需要传入一个 ...
- idea配置。
1.project Structure — 修改project(1.name,sdk,level(6-@Override in interface)) 修改modules(点击web,加上source ...
- Tensorflow学习笔记4:分布式Tensorflow
简介 Tensorflow API提供了Cluster.Server以及Supervisor来支持模型的分布式训练. 关于Tensorflow的分布式训练介绍可以参考Distributed Tenso ...
- nios II--实验3——led 100M软件部分
软件开发 参照实验二(led),该实验与实验二(led)的不同之处在于系统的时钟由50M提成为100M.运行结果,在调试窗口输出Hello from Nios II!,并且板上的四个LED灯流动显示, ...
- nios II--实验1——hello_world软件部分
hello_world 软件开发 首先,在硬件工程文件夹里面新建一个software的文件夹用于放置软件部分:打开toolsàNios II 11.0 Software Build Tools for ...
- 内网穿透神器ngrok——将本地项目驾到外网
相信做Web开发的同学们,经常会遇到需要将本地部署的Web应用能够让公网环境直接访问到的情况,例如微信应用调试.支付宝接口调试等.这个时候,一个叫ngrok的神器可能会帮到你,它提供了一个能够在公网安 ...
- Oracle学习——安装系列
简介:Oracle Database,又名Oracle RDBMS,或简称Oracle.是甲骨文公司的一款关系数据库管理系统.它是在数据库领域一直处于领先地位的产品.可以说Oracle数据库系统是目前 ...
- Spring + SpringMVC + MyBatis
1.需求说明实现用户通过数据库验证登录需求,采用Myeclipse+Tomcat 6.0+Mysql 5.0+JDK 1.6 2.数据库表开发所用是Mysql数据库,只建立单张用户表T_USER,表结 ...
- Linux 下以其他用户身份运行程序—— su、sudo、runuser
本文综合分析了Linux系统下,如何使用runuser命令.su命令和sudo命令以其他用户身份来运行程序,以及这三个命令的运行效率比较. 一.su 命令临时切换用户身份 SU:( Switch ...
- android修改系统时区
动态注册广播接收器必须有实例存在 静态不要实例存在 设置系统时区: AlarmManager mAlarmManager = (AlarmManager)getSystemService(Con ...