java反射类
⑴ 能说一下java的反射机制吗
反射:一个类有多个组成部分,例如:成员变量、方法、构造方法等
反射就是加载类,并解剖出类的各个组成部分
java中有一个Class类用于代表某一个类的字节码。Class类提供加载某个字节码的方法:forName()
forName方法用于加载某个类的字节码到内存中,并使用Class对象进行封装
另外两种得到Class对象的方式:
类名.class
对象。getClass()
SUN公司为简化创建对象的方法,它在Class对象中也提供了一个newInstance方法,用于创建类的对象,这样开发人员可以避免每次都需要去反射Constructor类以创建对象
不过需要注意的是,Class.newInstance方法内部是反射类无参的构造函数创建的对象,所以利用此种方式创建类对象时,类必须有一个无参的构造函数
总结如下:反射机制是开发框架时才运用到的技术
⑵ java反射机制的实现原理
反射机制就是java语言在运行时拥有一项自观的能力。
通过这种能力可以彻底的了解自身的情况为下一步的动作做准备。
下面具体介绍一下java的反射机制。这里你将颠覆原来对java的理解。
Java的反射机制的实现要借助于4个类:class,Constructor,Field,Method;
其中class代表的时类对象,
Constructor-类的构造器对象,
Field-类的属性对象,
Method-类的方法对象。
通过这四个对象我们可以粗略的看到一个类的各个组成部分。
Class:程序运行时,java运行时系统会对所有的对象进行运行时类型的处理。
这项信息记录了每个对象所属的类,虚拟机通常使用运行时类型信息选择正 确的方法来执行(摘自:白皮书)。
但是这些信息我们怎么得到啊,就要借助于class类对象了啊。
在Object类中定义了getClass()方法。我 们可以通过这个方法获得指定对象的类对象。然后我们通过分析这个对象就可以得到我们要的信息了。
比如:ArrayList arrayList;
Class clazz = arrayList.getClass();
然后我来处理这个对象clazz。
当然了Class类具有很多的方法,这里重点将和Constructor,Field,Method类有关系的方法。
Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。Java 的这一能力在实际应用中也许用得不是很多,但是个人认为要想对java有个更加深入的了解还是应该掌握的。
reflection的工作机制
考虑下面这个简单的例子,让我们看看 reflection 是如何工作的。
import java.lang.reflect.*;
public class DumpMethods {
public static void main(String args[]) {
try {
//forName("java.lang.String")获取指定的类的对象
Class c = Class.forName("java.lang.String");
Method m[] = c.getDeclaredMethods();
for (int i = 0; i < m.length; i++)
System.out.println(m[i].toString());
} catch (Throwable e) {
System.err.println(e);
}
}
}
按如下语句执行:
java DumpMethods java.util.ArrayList
这个程序使用 Class.forName 载入指定的类,然后调用 getDeclaredMethods 来获取这个类中定义了的方法列表。java.lang.reflect.Methods 是用来描述某个类中单个方法的一个类。
Java类反射中的主要方法
对于以下三类组件中的任何一类来说
-- 构造函数、字段和方法
-- java.lang.Class 提供四种独立的反射调用,以不同的方式来获得信息。调用都遵循一种标准格式。以下是用于查找构造函数的一组反射调用:
Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数,
Constructor[] getConstructors() -- 获得类的所有公共构造函数
Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关)
Constructor[] getDeclaredConstructors() -- 获得类的所有构造函数(与接入级别无关)
获得字段信息的Class 反射调用不同于那些用于接入构造函数的调用,在参数类型数组中使用了字段名:
Field getField(String name) -- 获得命名的公共字段
Field[] getFields() -- 获得类的所有公共字段
Field getDeclaredField(String name) -- 获得类声明的命名的字段
Field[] getDeclaredFields() -- 获得类声明的所有字段
用于获得方法信息函数:
Method getMethod(String name, Class[] params) -- 使用特定的参数类型,获得命名的公共方法
Method[] getMethods() -- 获得类的所有公共方法
Method getDeclaredMethod(String name, Class[] params) -- 使用特写的参数类型,获得类声明的命名的方法
Method[] getDeclaredMethods() -- 获得类声明的所有方法
使用 Reflection:
用于 reflection 的类,如 Method,可以在 java.lang.relfect 包中找到。使用这些类的时候必须要遵循三个步骤:
第一步是获得你想操作的类的 java.lang.Class 对象。
在运行中的 Java 程序中,用 java.lang.Class 类来描述类和接口等。
下面就是获得一个 Class 对象的方法之一:
Class c = Class.forName("java.lang.String");
这条语句得到一个 String 类的类对象。还有另一种方法,如下面的语句:
Class c = int.class;
或者
Class c = Integer.TYPE;
它们可获得基本类型的类信息。其中后一种方法中访问的是基本类型的封装类 (如 Intege ) 中预先定义好的 TYPE 字段。
第二步是调用诸如 getDeclaredMethods 的方法,以取得该类中定义的所有方法的列表。
一旦取得这个信息,就可以进行第三步了——使用 reflection API 来操作这些信息,如下面这段代码:
Class c = Class.forName("java.lang.String");
Method m[] = c.getDeclaredMethods();
System.out.println(m[0].toString());
它将以文本方式打印出 String 中定义的第一个方法的原型。
处理对象:
a.创建一个Class对象
b.通过getField 创建一个Field对象
c.调用Field.getXXX(Object)方法(XXX是Int,Float等,如果是对象就省略;Object是指实例).
例如:
import java.lang.reflect.*;
import java.awt.*;
class SampleGet {
public static void main(String[] args) throws Exception {
Rectangle r = new Rectangle(100, 325);
printHeight(r);
printWidth( r);
}
static void printHeight(Rectangle r)throws Exception {
//Field属性名
Field heightField;
//Integer属性值
Integer heightValue;
//创建一个Class对象
Class c = r.getClass();
//.通过getField 创建一个Field对象
heightField = c.getField("height");
//调用Field.getXXX(Object)方法(XXX是Int,Float等,如果是对象就省略;Object是指实例).
heightValue = (Integer) heightField.get(r);
System.out.println("Height: " + heightValue.toString());
}
static void printWidth(Rectangle r) throws Exception{
Field widthField;
Integer widthValue;
Class c = r.getClass();
widthField = c.getField("width");
widthValue = (Integer) widthField.get(r);
System.out.println("Height: " + widthValue.toString());
}
}
⑶ Java的反射机制是什么,如何实现
Java中的反射机制,通俗点解释就是能够在程序运行中动态获取到内存中任一对象的信息,这些信息包括对象所属类、类中的方法和属性、以及它们的访问控制域和返回值类型等等,还可以通过反射动态调用对象中的方法,而不管该方法的访问域是私有或是公开,包括构造方法,还能实现动态代理等。总之,反射能够破坏掉JAVA类本身的封装性,进而获取其私有的或公开的信息,也就能突破封装进而调用私有的或公开的方法。
实现的话就是通过反射接口,JAVA把反射相关的类接口都封装在了java.lang.reflect这个包中,你可以研究下这个包中的类,对于类的每一个属性,如变量、方法,构造方法,这个包中都就与之相对应的类,通过这个类就可以操作这个属性了。
java反射很强大,但也很危险,在实际开发中应少用或不用,在必要用之时,往往也能解决你遇到的问题。
⑷ 什么叫java反射
Reflection(反射) 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现interfaces(例如Serializable),也包括fields和methods的所有信息,并可于运行时改变fields内容或调用methods。
例如:
import java.lang.reflect.Method;
public class DumpMethods
{
public static void main(String[] args) throws Exception
{
Class<?> classType = Class.forName(args[0]);
Method[] methods = classType.getDeclaredMethods();
for(Method method : methods)
{
System.out.println(method);
}
}
}
⑸ Java镄勫弽灏勬満鍒讹纻
Java鍙嶅皠链哄埗鏄涓涓闱炲父寮哄ぇ镄勫姛鑳斤纴鍦ㄥ緢澶氩ぇ鍨嬮”鐩姣斿係pring,Mybatis閮藉彲浠ョ湅瑙佸弽灏勭殑韬褰便傞氲繃鍙嶅皠链哄埗鎴戜滑鍙浠ュ湪杩愯屾湡闂磋幏鍙栧硅薄镄勭被鍨嬩俊鎭锛屽埄鐢ㄨ繖涓鐗规ф垜浠鍙浠ュ疄鐜板伐铡傛ā寮忓拰浠g悊妯″纺绛夎捐℃ā寮忥纴钖屾椂涔熷彲浠ヨВ鍐矹ava娉涘瀷镎﹂櫎绛変护浜鸿嫤鎭肩殑闂棰樸备笅闱java璇剧▼灏变粠瀹为檯搴旂敤镄勮掑害鍑哄彂锛屾潵搴旂敤涓涓婮ava镄勫弽灏勬満鍒躲
鍙嶅皠锘虹
p.s:链鏂囬渶瑕佽昏呭瑰弽灏勬満鍒剁殑API链変竴瀹氱▼搴︾殑浜呜В锛屽傛灉涔嫔墠娌℃湁鎺ヨЕ杩囩殑璇濓纴寤鸿鍏堢湅涓涓嫔畼鏂规枃妗g殑QuickStart銆
鍦ㄥ簲鐢ㄥ弽灏勬満鍒朵箣鍓嶏纴棣栧厛鎴戜滑鍏堟潵鐪嬩竴涓嫔备綍銮峰彇涓涓瀵硅薄瀵瑰簲镄勫弽灏勭被Class锛屽湪Java涓鎴戜滑链変笁绉嶆柟娉曞彲浠ヨ幏鍙栦竴涓瀵硅薄镄勫弽灏勭被銆
阃氲繃getClass鏂规硶
鍦↗ava涓锛屾疮涓涓狾bject閮芥湁涓涓猤etClass鏂规硶锛岄氲繃getClass鏂规硶鎴戜滑鍙浠ヨ幏鍙栧埌杩欎釜瀵硅薄瀵瑰簲镄勫弽灏勭被锛
Strings="ziwenxie";
Class<?>c=s.getClass();
阃氲繃forName鏂规硶
鎴戜滑涔熷彲浠ヨ皟鐢–lass绫荤殑闱欐佹柟娉昮orName锛
Class<?>c=Class.forName("java.lang.String");
浣跨敤.class
鎴栬呮垜浠涔熷彲浠ョ洿鎺ヤ娇鐢.class锛
Class<?>c=String.class;
銮峰彇绫诲瀷淇℃伅
鍦ㄦ枃绔犲紑澶存垜浠灏辨彁鍒板弽灏勭殑涓澶уソ澶勫氨鏄鍙浠ュ厑璁告垜浠鍦ㄨ繍琛屾湡闂磋幏鍙栧硅薄镄勭被鍨嬩俊鎭锛屼笅闱㈡垜浠阃氲繃涓涓渚嫔瓙𨱒ュ叿浣撶湅涓涓嬨
棣栧厛鎴戜滑鍦╰ypeinfo.interfacea鍖呬笅闱㈡柊寤轰竴涓鎺ュ彛A锛
packagetypeinfo.interfacea;
publicinterfaceA{voidf();}
鎺ョ潃鎴戜滑鍦╰ypeinfo.packageaccess鍖呬笅闱㈡柊寤轰竴涓鎺ュ彛C锛屾帴鍙C缁ф圹镊鎺ュ彛A锛屽苟涓旀垜浠杩桦彟澶栧垱寤轰简鍑犱釜鐢ㄤ簬娴嬭瘯镄勬柟娉曪纴娉ㄦ剰涓嬮溃鍑犱釜鏂规硶镄勬潈闄愰兘鏄涓嶅悓镄勚
⑹ JAVA中反射是什么
JAVA中反射是动态获取信息以及动态调用对象方法的一种反射机制。
Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。而这也是Java被视为动态语言的一个关键性质。
Java反射的功能是在运行时判断任意一个对象所属的类,在运行时构造任意一个类的对象,在运行时判断任意一个类所具有的成员变量和方法,在运行时调用任意一个对象的方法,生成动态代理。
(6)java反射类扩展阅读:
JAVA中反射实例:
1、Class superClass=clazz.getSuperclass();//获取父类。
System.out.println("getSuperclass:"+superClass)。
2、Class[] interfaces=clazz.getInterfaces();//获取实现接口。
System.out.println("getInterfaces:"+interfaces.length)。
3、Constructor[] cons=clazz.getConstructors();//构造方法。
System.out.println("getConstructors:"+cons.length)。
参考资料来源:网络: JAVA反射机制
⑺ java中反射的三种方法是
第一种:通过forName()方法;
第二种:类.class;
第三种:对象.getClass()。
举例如下:
package
test;
public class Demo{
public static void
main(){
Class<?> c1 = null;
Class<?> c2 =
null;
Class<?> c3 =
null;
//三种反射用实例化方式
try{
//最常用的一种形式
c1 =
Class.forName("test.X");
}catch(ClassNotFoundException
e){
e.printStackTrace();
}
//通过Object类中的方法实例化
c2
= new X().getClass();
//通过类.class实例化
c3 =
X.class;
System.out.println("类名:" + c1.getName());
//得到类名
System.out.println("类名:" + c2.getName());
//得到类名
System.out.println("类名:" + c3.getName());
//得到类名
}
}