Java反射机制<1>
如果要通过一个对象找到一个类的名称,此时就需要用到反射机制(反射技术是用来做框架的,一般情况下Java私有对象不能被访问,但是暴力反射可以访问私有对象)。
任何一个类如果没有明确地声明继承自哪个父类的时候,则默认继承Object类,所以getClass()方法是Object类中的。
文件在包java_reflect目录下
// 类名:Y
// 属性:
// 方法:
class Y{ }
//=================================================
// File Name : GetClass_demo
//------------------------------------------------------------------------------
// Author : Common // 类名:Y
// 属性:
// 方法:
class Y{ } //主类
//Function : GetClass_demo;
public class GetClass_demo { public static void main(String[] args) {
// TODO 自动生成的方法存根
Y y = new Y();
System.out.println(y.getClass().getName());
} }
输出 

实例化Class类对象的3种方法
//=================================================
// File Name : GetClass_demo
//------------------------------------------------------------------------------
// Author : Common // 类名:Y
// 属性:
// 方法:
class Y{ } //主类
//Function : GetClass_demo;
public class GetClass_demo { public static void main(String[] args) {
// TODO 自动生成的方法存根 Class<?> c1 = null;
Class<?> c2 = null;
Class<?> c3 = null;
try{
c1 = Class.forName("java_basic.Y"); //通过forName()方法实例化对象
}catch(ClassNotFoundException e){
e.printStackTrace();
} c2 = new Y().getClass(); //通过Object类中的方法实例 c3 = Y.class; //通过类.class实例化
System.out.println("类名称"+c1.getName());
System.out.println("类名称"+c2.getName());
System.out.println("类名称"+c3.getName());
} }
输出
Class类的使用
Class类在开发中最常见的用法就是实例化对象的操作,即可以通过一个给定的字符串(此字符串包含了完整的“包.类”的路径)来实例化一个类的对象。
1.通过无参构造实例化对象
如果要想通过Class类对象实例化其他类的对象,则可以使用newInstance()方法,但是必须要保证被实例化的类中存在一个无参构造方法
//=================================================
// File Name : InstanceClass_demo
//------------------------------------------------------------------------------
// Author : Common //主类
//Function : InstanceClass_demo;
public class InstanceClass_demo { public static void main(String[] args) {
// TODO 自动生成的方法存根
Class<?> c = null; //指定泛型
try{
c = Class.forName("person"); //传入要实例化类的完整包.类名称
}catch(ClassNotFoundException e){
e.printStackTrace();
}
person per = null; //声明person对象
try{
per = (person)c.newInstance(); //实例化person对象
}catch(Exception e){
e.printStackTrace();
}
per.setAge(30);
per.setName("张三");
System.out.println(per);
} }
输出 
2.调用有参构造实例化对象

import java.lang.reflect.Constructor; //=================================================
// File Name : InstanceClass_demo
//------------------------------------------------------------------------------
// Author : Common //主类
//Function : InstanceClass_demo;
public class InstanceClass_demo { public static void main(String[] args) {
// TODO 自动生成的方法存根
Class<?> c = null; //指定泛型
try{
c = Class.forName("person"); //传入要实例化类的完整包.类名称
}catch(ClassNotFoundException e){
e.printStackTrace();
}
person per = null; //声明person对象
Constructor<?> cons[] = null; //声明一个表示构造方法的数组
cons = c.getConstructors(); //通过反射取得全部构造
try{
per = (person) cons[0].newInstance("张三",30); //实例化person对象
}catch(Exception e){
e.printStackTrace();
}
// per.setAge(30);
// per.setName("张三");
System.out.println(per);
} }
输出 
可以通过反射得到一个类的完整结构,需要使用到java.lang.reflect包中的以下几个类。
Constructor:表示类中的构造方法
Field:表示类中的属性
Method:表示类中的方法
这3个类都是AccessibleObject类中的子类
//=================================================
// File Name : ConstructorClass_demo
//------------------------------------------------------------------------------
// Author : Common // 接口名:China
// 属性:
// 方法:
interface China{
public static final String NATIONAL = "China";
public static final String AUTHOR = "张三";
public void sayChina();
public String sayHello(String name,int age);
} //类名:Person__
//属性:
//方法:
class Person_5 implements China{ private String name;
private int age; public Person_5(){ //无参构造方法 } public Person_5(String name) { //声明两个参数的构造方法
super();
this.name = name;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Person_5(String name, int age) {
super();
this.name = name;
this.age = age;
} @Override
public void sayChina() {
// TODO 自动生成的方法存根
System.out.println("作者:"+AUTHOR+"国籍:"+NATIONAL);
} @Override
public String sayHello(String name, int age) {
// TODO 自动生成的方法存根
return name+"age:"+age;
} } //主类
//Function : ConstructorClass_demo;
public class ConstructorClass_demo { public static void main(String[] args) {
// TODO 自动生成的方法存根
Class<?> c1 = null; //指定泛型
try{
c1 = Class.forName("Person_5"); //传入要实例化类的完整包.类名称
}catch(ClassNotFoundException e){
e.printStackTrace();
}
Class<?> c[] = c1.getInterfaces(); //取得实现的全部接口
for(int i=0;i<c.length;i++){
System.out.println("实现的接口名称:"+c[i].getName());
} } }

取得父类
一个类可以实现多个接口,但是只能继承一个父类,所以如果要取得一个类的父类,可以直接使用class类中的getSuperclass()方法。
//=================================================
// File Name : ConstructorClass_demo
//------------------------------------------------------------------------------
// Author : Common // 接口名:China
// 属性:
// 方法:
interface China{
public static final String NATIONAL = "China";
public static final String AUTHOR = "张三";
public void sayChina();
public String sayHello(String name,int age);
} //类名:Person__
//属性:
//方法:
class Person_5 implements China{ private String name;
private int age; public Person_5(){ //无参构造方法 } public Person_5(String name) { //声明两个参数的构造方法
super();
this.name = name;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Person_5(String name, int age) {
super();
this.name = name;
this.age = age;
} @Override
public void sayChina() {
// TODO 自动生成的方法存根
System.out.println("作者:"+AUTHOR+"国籍:"+NATIONAL);
} @Override
public String sayHello(String name, int age) {
// TODO 自动生成的方法存根
return name+"age:"+age;
} } //主类
//Function : ConstructorClass_demo;
public class ConstructorClass_demo { public static void main(String[] args) {
// TODO 自动生成的方法存根
Class<?> c1 = null; //指定泛型
try{
c1 = Class.forName("Person_5"); //传入要实例化类的完整包.类名称
}catch(ClassNotFoundException e){
e.printStackTrace();
} Class<?> c2 = c1.getSuperclass(); //取得父类
System.out.println("实现的接口名称:"+c2.getName());
} }
取得全部构造方法
要取得一个类中的全部构造方法,则必须使用Class类中的getConstructors()方法。
import java.lang.reflect.Constructor; //=================================================
// File Name : ConstructorClass_demo
//------------------------------------------------------------------------------
// Author : Common // 接口名:China
// 属性:
// 方法:
interface China{
public static final String NATIONAL = "China";
public static final String AUTHOR = "张三";
public void sayChina();
public String sayHello(String name,int age);
} //类名:Person__
//属性:
//方法:
class Person_5 implements China{ private String name;
private int age; public Person_5(){ //无参构造方法 } public Person_5(String name) { //声明两个参数的构造方法
super();
this.name = name;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Person_5(String name, int age) {
super();
this.name = name;
this.age = age;
} @Override
public void sayChina() {
// TODO 自动生成的方法存根
System.out.println("作者:"+AUTHOR+"国籍:"+NATIONAL);
} @Override
public String sayHello(String name, int age) {
// TODO 自动生成的方法存根
return name+"age:"+age;
} } //主类
//Function : ConstructorClass_demo;
public class ConstructorClass_demo { public static void main(String[] args) {
// TODO 自动生成的方法存根
Class<?> c1 = null; //指定泛型
try{
c1 = Class.forName("Person_5"); //传入要实例化类的完整包.类名称
}catch(ClassNotFoundException e){
e.printStackTrace();
} Constructor<?> c[] = c1.getConstructors(); //取得全部的构造方法
for(int i=0;i<c.length;i++){
System.out.println("全部的构造方法:"+c[i]);
}
} }
取得全部方法
要取得一个类中的全部方法,可以使用Class类中的getMethods()方法,此方法返回一个Method类的对象数组。
如果要进一步取得方法的具体信息,例如,方法的参数、抛出的异常声明等,则就必须依靠Method类。
import java.lang.reflect.Method;
import java.lang.reflect.Modifier; //=================================================
// File Name : GetMethod_demo
//------------------------------------------------------------------------------
// Author : Common //主类
//Function : GetMethod_demo;
public class GetMethod_demo { public static void main(String[] args) {
// TODO 自动生成的方法存根
Class<?> c1 = null; //指定泛型
try{
c1 = Class.forName("Person_5"); //传入要实例化类的完整包.类名称
}catch(ClassNotFoundException e){
e.printStackTrace();
} Method m[] = c1.getMethods(); //取得全部的方法
for(int i=0;i<m.length;i++){ //循环输出
Class<?> r = m[i].getReturnType(); //得到方法的返回值类型
Class<?> p[] = m[i].getParameterTypes(); //得到全部的参数类型
int xx = m[i].getModifiers(); //得到方法的修饰符,即public System.out.print(Modifier.toString(xx)+" "); //还原修饰符
System.out.print(r.getName()+" "); //得到方法返回值
System.out.print(m[i].getName()); //取得方法的名称
System.out.print("(");
for(int x=0;x<p.length;x++){
System.out.print(p[x].getName()+" "+"arg"+x); //输出参数
if(x<p.length-1){
System.out.print(",");
}
}
Class<?> ex[] = m[i].getExceptionTypes(); //得到全部的异常抛出
if(ex.length>0){ //判断是否有异常
System.out.print(") throws ");
}else{
System.out.print(") ");
}
for(int j=0;j<ex.length;j++){
System.out.println(ex[j].getName()); //输出异常信息
if(j<ex.length-1){
System.out.println(",");
}
}
System.out.println();
}
} }
取得全部属性

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier; //=================================================
// File Name : GetMethod_demo
//------------------------------------------------------------------------------
// Author : Common //主类
//Function : GetMethod_demo;
public class GetMethod_demo { public static void main(String[] args) {
// TODO 自动生成的方法存根
Class<?> c1 = null; //指定泛型
try{
c1 = Class.forName("Person_5"); //传入要实例化类的完整包.类名称
}catch(ClassNotFoundException e){
e.printStackTrace();
} // Method m[] = c1.getMethods(); //取得全部的方法
// for(int i=0;i<m.length;i++){ //循环输出
// Class<?> r = m[i].getReturnType(); //得到方法的返回值类型
// Class<?> p[] = m[i].getParameterTypes(); //得到全部的参数类型
// int xx = m[i].getModifiers(); //得到方法的修饰符,即public
//
// System.out.print(Modifier.toString(xx)+" "); //还原修饰符
// System.out.print(r.getName()+" "); //得到方法返回值
// System.out.print(m[i].getName()); //取得方法的名称
// System.out.print("(");
// for(int x=0;x<p.length;x++){
// System.out.print(p[x].getName()+" "+"arg"+x); //输出参数
// if(x<p.length-1){
// System.out.print(",");
// }
// }
// Class<?> ex[] = m[i].getExceptionTypes(); //得到全部的异常抛出
// if(ex.length>0){ //判断是否有异常
// System.out.print(") throws ");
// }else{
// System.out.print(") ");
// }
// for(int j=0;j<ex.length;j++){
// System.out.println(ex[j].getName()); //输出异常信息
// if(j<ex.length-1){
// System.out.println(",");
// }
// }
// System.out.println();
// } {
Field f[] = c1.getDeclaredFields(); //取得本类属性
for(int i=0;i<f.length;i++){
Class<?> r = f[i].getType(); //取出属性的类型
int mo = f[i].getModifiers(); //得到修饰符数字
String priv = Modifier.toString(mo); //取得属性的修饰符
System.out.print("本类属性:");
System.out.print(priv + " "); //输出修饰符
System.out.print(r.getName()+" "); //输出属性类型
System.out.print(f[i].getName()); //输出属性名称
System.out.println(" ;");
}
} {
Field f[] = c1.getFields(); //取得父类公共属性
for(int i=0;i<f.length;i++){
Class<?> r = f[i].getType(); //取出属性的类型
int mo = f[i].getModifiers(); //得到修饰符数字
String priv = Modifier.toString(mo); //取得属性的修饰符
System.out.print("本类属性:");
System.out.print(priv + " "); //输出修饰符
System.out.print(r.getName()+" "); //输出属性类型
System.out.print(f[i].getName()); //输出属性名称
System.out.println(" ;");
}
} } }
Java反射机制<1>的更多相关文章
- 第28章 java反射机制
java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...
- Java反射机制
Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射: 静态编译:在编译时确定类型,绑定对象,即通过 ...
- java基础知识(十一)java反射机制(上)
java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...
- java基础知识(十一)java反射机制(下)
1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...
- Java反射机制专题
·Java Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方 ...
- java反射机制深入详解
java反射机制深入详解 转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...
- Java反射机制DOME
Java反射机制 public class TestHibernate { @Test public void TestHb(){ try { Class cs = Class.forName(&qu ...
- 反射——Java反射机制
反射概述 什么是反射? ① 反射的概念是由Smith在1982年首次提出的,主要指程序可以访问.检测和修改它本身状态或行为的一种能力. ② JAVA反射机制是在运行状态中,对应任意一个类,都能 ...
- Java反射机制可以动态修改实例中final修饰的成员变量吗?
问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. ...
- Java反射机制学习与研究
Java反射机制:可以获取正在运行时的Java对象. 1.判断运行时对象对象所属的类. 2.判断运行时对象所具有的成员变量和方法. 3.还可以调用到private方法,改变private变量的值. S ...
随机推荐
- 屠龙之路_战胜狮身人面怪物_SecondDay
第二天,少年们跋山涉水来到了恶龙山的山脚.前面有一座迷宫,守卫迷宫的是一只狮身人面的怪物,它出一个谜语让少年们猜,如果屠龙团猜不出答案就会被吃掉(如果你能猜出来,我就让你--),它问:"软件 ...
- URL(待整合到HTTP书中哦)
一:scheme://host.domain:port/path/filename scheme - 定义因特网服务的类型.最常见的类型是 http host - 定义域主机(http 的默认主机是 ...
- java 时间操作
设置获取时间日期格式 // 设置日期格式 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 为 ...
- 如何用css画出三角形
看到有面试题里会有问到如何用css画出三角形 众所周知好多图形都可以拆分成三角形,所以说会了画三角形就可以画出很多有意思的形状 画出三角形的原理是调整border(边框)的四个方向的宽度,线条样式以及 ...
- Java并发和多线程(一)基础知识
1.java线程状态 Java中的线程可以处于下列状态之一: NEW: 至今尚未启动的线程处于这种状态. RUNNABLE: 正在 Java 虚拟机中执行的线程处于这种状态. BLOCKED: 受阻塞 ...
- BZOJ 1064 假面舞会(NOI2008) DFS判环
此题,回想Sunshinezff学长给我们出的模拟题,原题啊有木有!!此处吐槽Sunshinezff爷出题不人道!! 不过也感谢Sunshinezff学长的帮助,我才能做出来.. 1064: [Noi ...
- 【bzoj2120】 数颜色
http://www.lydsy.com/JudgeOnline/problem.php?id=2120 (题目链接) 题意 给出一个n个数,m个询问,每次询问一个区间或修改一个数,求区间内不同的数有 ...
- MVC3项目依赖文件错误解决
MVC3的项目依赖分为两大类: 1.ASP.NET Web Pages 2.ASP.NET MVC 3 如果没有正确引入,或者项目的版本有错误会出现程序集引用错误. 在服务器上部署时,解决思路如下: ...
- Oracle 11g新特性
文章转自网络 Oracle 11g于2007年7月11日美国东部时间11时(北京时间11日22时)正式发布,11g是甲骨文公司30年来发布的最重要的数据库版本,根据用户的需求实现了信息生命周期管理(I ...
- Android成长日记-LogCat
1. Log日志级别 Log.v(tag,messag) //verbose模式,打印最详细的日志输出颜色为黑色 Log.d(tag,messag) //debug级别的日志,颜色为蓝色 Log.i( ...