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反射机制实例解析的更多相关文章

  1. Java反射机制(Reflect)解析-----https://www.cnblogs.com/fzz9/p/7738381.html

    Java反射机制(Reflect)解析-----https://www.cnblogs.com/fzz9/p/7738381.html

  2. Java反射机制(Reflect)解析

    一.导读 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计 ...

  3. java反射机制实例

    1.通过数据库字段反射给对象实例赋值 convertClass.java /** * 通过反射构造对象 * @param obj * @param rs * @return */ public Obj ...

  4. Java 基础之详解 Java 反射机制

    一.什么是 Java 的反射机制?   反射(Reflection)是Java的高级特性之一,是框架实现的基础,定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: ...

  5. [转]Java反射机制详解

    目录 1反射机制是什么 2反射机制能做什么 3反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实例化Class类对象 ·获取一个对象的父类与实现的接口 ·获取某个类中的全部构造函数 - 详 ...

  6. 【转载】Java反射机制详解

    转自:http://baike.xsoftlab.net/view/209.html#3_8 1反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对 ...

  7. Java知识总结:Java反射机制(用实例理解)

    概念理解: 反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来 实现对自己行为的描述( self-representation )和检测( examination) ,并能 ...

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

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

  9. java反射机制简单实例

    目录 Java反射 简单实例 @(目录) Java反射 Java语言允许通过程序化的方式间接对Class进行操作.Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通 ...

随机推荐

  1. 理解Android安全机制

    本文从Android系统架构着手,分析Android的安全机制以SE Android,最后给出一些Android安全现状和常见的安全解决方案. 1.Android系统架构 Android采用分层的系统 ...

  2. linux 系统下 android studio 获取SHA1

    百度地图申请key的时候需要填写包名和SHA1 包名比较好找可以在 AndroidManifest.xml 文件中找到 SHA1的获取方式有两种可以在android studio 下面选择Termin ...

  3. Code.R团队展示

    团队成员: 031302620马凛凛(队长) 031302619吕昆明 031302319汪毓顺 031302404陈俊达 团队名称: Code.R 团队项目: 基于web的教师报课系统 团队成员风采 ...

  4. 一个Activity掌握Android4.0新控件 (转)

    原文地址:http://blog.csdn.net/lavor_zl/article/details/51261380 谷歌在推出Android4.0的同时推出了一些新控件,Android4.0中最常 ...

  5. 升級 Centos 6.5 的 php 版本

    升級 Centos 6.5 的 php 版本   待會再看 Centos 6.5 的 php 預設是用 5.3.3 這個版本號 最近想要改用 Laravel 4.1 發現需要 5.3.7 才能用,所以 ...

  6. [转]看懂ExtJS的API

    原文地址:http://www.cnblogs.com/youring2/archive/2013/03/05/2944004.html ExtJS的功能很强大,相应的其API也很庞大,并且看起来并不 ...

  7. 【51NOD 1478】括号序列的最长合法子段

    很恶心啊,一道水题改了半天,主要是各种细节没有注意到,包括左括号剩余时有可能会出错的情况,需要从后往前扫 贡献一组测试数据: ((()))())(())(( 答案:8 1 #include<cs ...

  8. bzoj1834

    第一问很好搞.第二问事实上可以这么想.如果一条边的流量还有,那么我们走过去不要钱,否则要钱,于是跑个费用流,就好了 (其实跑k次spfa也可以,我是这么写的) #include<cstdio&g ...

  9. 【HDU 5744】Keep On Movin

    找出奇数个的数有几个,就分几组. #include<cstdio> #include<cstring> #include<algorithm> #include&l ...

  10. Java反编译插件JadClipse

    Java反编译是很容易的,现在就介绍一个反编译插件,以后我们通过Ctrl+鼠标左键查看源码就容易得多了,不用再担心源码找不到了,配置过程很简单的. 准备: 1.下载JadClipse(jar文件,ec ...