黑马程序员——Java反射-整理笔记

原创 2015年07月06日 18:26:25

                                             ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

反射的概念:

         反射就是把Java类中的各种成分映射相成Java类。

反射机制:

        简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息。

反射机制的优缺点:

      首先得先明白静态编译和动态编译是什么

               静态编译:在编译时确定类型,绑定对象,即通过。 

               动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多 态的应用,有以降低类之间的藕合性。 

      反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性。

      它的缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它 满足我们的要求。这类操作总是慢于只直接执行相同的操作。

Class类用于表示.class文件,是所有加载进内存的字节码对象的父类。所以可以通过Class得到运行时的类。

其中有三种方法可以获取Class类的对象:

   (例如已先声明了一个Person类)

//第一种方式:  
Class c1 = Class.forName("Person");  
//第二种方式:  
//java中每个类型都有class 属性.  
Class c2 = Person.class;  
   
//第三种方式:  
//java语言中任何一个java对象都有getClass方法  
Employeee = new Person();  
Class c3 = e.getClass(); //c3是运行时类 (e的运行时类是Person) 
创建Class对象

     Class c=Class.forName("className");//注明:className必须为全名,也就是得包含包名,比如,cn.my.Person; 
    Object obj=c.newInstance();//创建对象的实例 
有了对象后就可以获取类的各种信息了

 获得构造函数的方法 
    Constructor getConstructor(Class[] params)//根据指定参数获得public构造器
    Constructor[] getConstructors()//获得public的所有构造器
    Constructor getDeclaredConstructor(Class[] params)//根据指定参数获得public和非public的构造器
    Constructor[] getDeclaredConstructors()//获得public的所有构造器 


    获得类方法
    Method getMethod(String name, Class[] params),根据方法名,参数类型获得方法
    Method[] getMethods()//获得所有的public方法
    Method getDeclaredMethod(String name, Class[] params)//根据方法名和参数类型,获得public和非public的方法
    Method[] getDeclaredMethods()//获得所以的public和非public方法 


    获得类中属性 
    Field getField(String name)//根据变量名得到相应的public变量
    Field[] getFields()//获得类中所以public的方法
    Field getDeclaredField(String name)//根据方法名获得public和非public变量
    Field[] getDeclaredFields()//获得类中所有的public和非public方法 

   boolean isPrimitive()--判断当前类是否为基本类型(基本类型有boolean、byte、char、short、int、long、float 和 double)

   boolean isArray()--判断当前类是否为数组(数组也是类,例如int[].class)


Field类:Field对象对应到类上面的成员变量,而不是类对象上的成员变量

代码示例:

import java.lang.reflect.Field;
public class Person {
    
	public int age;
    private int height;
    
    public Person(int age,int height){
        this.age=age;
        this.height=height;
    }
    

}

class ReflectTest{
public static void main(String...args) throws Exception{
    	
        Person person = new Person(20,30);
        //获取所有的成员变量(包括私有成员变量)
        Field[] fields = person.getClass().getDeclaredFields();
        //获取Person类的公共成员变量age
        Field fieldAge = person.getClass().getField("age");
        //获取成员变量的类型
        Class type = fieldAge.getType();
        //设置age成员变量的值
        fieldAge.set(person, 34);
        //获取成员变量age的值
        Object s = fieldAge.get(person);
        
        
        Field fieldHight = person.getClass().getField("height");
        //使用setAccessible(true),才能获取私有变量
        fieldHight.setAccessible(true);
        //获取私有成员变量的值
        Object h =fieldHight.get(person);
        System.out.println(s);
    }
}

Method方法:Method类代表某个类中的一个成员方法。

例如:Method charAt =Class.forName(“java.lang.String”).getMethod(“charAt”,int.class);

      调用方法: 
            常用方式:System.out.println(str.charAt(1));
            反射方式:System.out.println(charAt.invoke(str,1));
      jdk1.4和jdk1.5的invoke方法的区别: 
           jdk1.5: public Object invoke(Object obj,Object …args);
           jdk1.4: public Object invoke(Object[] args);

反射操作数组的小例子:

import java.lang.reflect.*;  
class hello{  
    public static void main(String[] args) {  
        int[] temp={1,2,3,4,5};  
        Class<?>demo=temp.getClass().getComponentType();  //<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">getComponentType方法</span><span style="font-size: 12px; font-family: Arial, Helvetica, sans-serif;">返回表示数组组件类型的 Class</span>
        System.out.println("数组类型: "+demo.getName());  
        System.out.println("数组长度  "+Array.getLength(temp));  
        System.out.println("数组的第一个元素: "+Array.get(temp, 0));  
        Array.set(temp, 0, 100);  
        System.out.println("修改之后数组第一个元素为: "+Array.get(temp, 0));


                                          ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

黑马程序员——java学习笔记--反射机制

什么是反射: 反射是java语言的一个特性,它允许程序在运行时来进行自我检查并且对内部的成员进行操作。例如它允许一个java的类获取他所有的成员变量和方法并且显示出来。 java的反射机制的实现要借...

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

黑马程序员:Java学习笔记——反射     ---------------------- android培训、java培训、期待与您交流! ---------------------- ...

黑马程序员Java笔记——反射、正则

----------- android培训、java培训、java学习型技术博客、期待与您交流! ---------  反射   反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容...

黑马程序员——java基础笔记:反射机制

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-一:反射机制的概念 反射,从字面来理解,就是反着来,我们正常的习惯是通过对象来调用属性和方法,反射机制给我们提供了...

黑马程序员——java高新技术1学习笔记整理

java高新技术1学习笔记整理 1:myeclipse是eclipse的功能扩展,直接下载myeclipse即可。myeclipse是一个用来编辑java程序的高级编程工具。集成开发工具(IDE)。...

黑马程序员——java高新技术2学习笔记整理

------- android培训、java培训、期待与您交流! ---------- java高新技术2学习笔记整理 1:BeanUtils工具包:提供了一些静态方法,可以操作JavaBean的...

黑马程序员——JAVA笔记之Java反射

反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容。而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员。简单说:反射技术可以对一个类进行解剖。 反射的...

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

1、什么是反射? 我认为,简单的来说就是在运行时可以获取相应的类中各项信息的一个机制。也就是说可以获取在编译时不能获得的类的信息。 2、反射有什么用? 前面说了,通过反射可以获取在编译时不能获得的有关...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)