黑马程序员 JAVA学习笔记 ——反射

android培训java培训、期待与您交流!

一、什么是反射:
反射的概念是由 Smith 1982 年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用 , 并在 Lisp 和面向对象方面取得了成绩。其中 LEAD/LEAD++ OpenC++  MetaXa OpenJava 等就是基于反射机制的语言。最近,反射机制也被应用到了视窗系统、操作系统和文件系统中。

反射本身并不是一个新概念,尽管计算机科学赋予了反射概念新的含义。在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述( self-representation )和监测( examination ),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
二、什么是 Java 中的类反射:
Reflection 
 Java  程序开发语言的特征之一,它允许运行中的  Java  程序对自身进行检查,或者说 自审 ,并能直接操作程序的内部属性和方法。 Java  的这一能力在实际应用中用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性。例如, Pascal 或者 C++  中就没有办法在程序中获得函数定义相关的信息。
Reflection 
 Java  被视为动态(或准动态)语言的关键,允许程序于执行期  Reflection APIs  取得任何已知名称之  class  的內部信息,包括  package type parameters superclass implemented interfaces inner classes, outer class, fields constructors methods modifiers ,並可于执行期生成 instances 、变更  fields  內容或唤起  methods

三、实际学习
反射 
java.lang.reflect.AccessibleObject类中有三个子类 
 
Constructor(构造函数)Field(属性)Method(方法)
反射的基本步骤:
获得CLASS对象 就是获取到指定的名称的字节码文件对象。
实例化对象,获得类的属性、方法、构造函数。
访问属性 调用方法 调用构造函数创建对象。
  测试用的类:
public class tess extends Object {
private  int x=0,y=11;
public boolean q=false,w=true;
tess(){}
void returnx()
{System.out.println(x);}
public void tess1()
{}
public void tess1(String x,int f)
{System.out.println(x+"  "+f); }
private void test()
{}
boolean returnq()
{return q;}
}

 反射的基本操作:
获取属性: 
 
public  class  fanshe {
public  static  void  main( String[]  argsthrows  Exception  {
Class  c = tess. class; //tess
Object  obj = tess. class. newInstance(); //
Field [] f = c. getDeclaredFields(); //
for( Field  fi: f)
{ fi. setAccessible( true); //
System. out. println( fi. getType() + "  " + fi. getName()  +  "  "  + fi. get( obj)); //     
}} 
 







运行结果:

 
获取方法:  插入代码有问题代码重叠在一起 所以直接复制了
 
public class fanshe {
public static void main(String[] args) throws Exception  {
Class c=tess.class;
Object obj=tess.class.newInstance();
for(Method m1:m)
{m1.setAccessible(true);
System.out.println("方法名:"+m1.getName() +"\n方法修饰符:"+Modifier.toString(m1.getModifiers())+ "\n 方法返回类型:"+m1.getReturnType()+"  " );
Class[] p = m1.getParameterTypes();//获取方法的参数
System.out.print("方法参数:");
for(int x=0;x<p.length;x++)
{ if(x>0)System.out.print(",");
System.out.print(p[x].getName());
}
System.out.println();
}  
运行结果: 


单个获取方法:
 
public  class  fanshe {
public  static  void  main( String[]  argsthrows  Exception  {
Class  c = tess. class;
Object  obj = tess. class. newInstance();
Method  m2  = c. getDeclaredMethod( "tess1", String. class, int. class);
m2. invoke( obj"lihaiyun", 22);}}//运行方法
 
运行结果:   
 

获取构造函数:
public  class  fanshe {
public  static  void  main( String[]  argsthrows  Exception  {
Class  c = tess. class;
Object  obj = tess. class. newInstance();
Constructor[]  constructor = c. getDeclaredConstructors(); // 
for( Constructor  con: constructor)
{ System. out. println( con.getname());}
}}
 运行结果:
 

反射的好处:大大提高了程序的扩展性 
运行期类型的判断,动态类加载,动态代理使用反射。 
反射的坏处:影响
性能,反射相当于一系列解释操作,通知jvm要做的事情,性能比直接的java代码要慢很多。
感觉反射就像面镜子一样可以返照出整个类。但这样让我感觉是不是破坏了程序的封装性,百度一下以后 这句话还是蛮有道理的:
其实不必太在意这个,任何事物都要规矩,语言本身只是个工具,用来解决我们的问题,当他在一些方面受限时,只要有一种方法能解决这个问题,就是好的。想想 eclipse里大部分关键字输入完后点一下都会跳出一个都是函数的框 这应该是反射的一种应用吧。

android培训java培训、期待与您交流!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值