反射技术基本知识总结

JAVA反射的精妙总结:反射就是将JAVA类中的各个成分映射成相应的JAVA类

知识点一:获取Class对象方法

1.lass.forName(classname)     用于做类加载

2.obj.getClass()                            用于获得对象的类型

3.  类名.class                                用于获得指定的类型,传参用

4. JAVA中九个预定义的实例对象

基本数据类型(byte、boolean、short、int、long、double、float、char)字节码对象以及void.class

另外:具有相同的数据类型和维度的数组在java中映射成同一个Class对象

判断是否为数组类型,用Class.isArray()方法


知识点二: Field类

 Field类。。。。。。(成员变量的反射)

1.Field getField(String s);//只能获取该类公有和父类中公有

2.Field getDeclaredField(String s);//获取该类中任意成员变量,包括私有

3.setAcessible(true);如果是私有字段,要先将私有字段进行取消权限检查的能力。也称暴力访问

4.set(Objectobj,Object value)将指定对象变量上此Field对象表示的字段设置为指定的新值

5.Object get(Objectobj);返回指定对象上Field表示的字段的值


知识点三:Method类

Method类。。。。。。(成员方法的反射):代表某个类中的一个成员方法

1.Method[]getMethods();只获取公共和父类中的所有方法

2.Method[]getDeclaredMethods();获取本类中方法包含私有方法

3.Medthod[]getMethod("方法名",参数.class(空参可以写null));

4.Object invoke(Objectobj,参数);调用方法:如果方法是静态的,invoke中的参数可写为null

5.通过反射来调用main函数,invoke()方法传递一个字符串数组参数的方法

1).me.invoke(null,newobject[](new String[]{“11”,“22”,“33”}));

2).me.invoke(null,(Object)newString[]{“11”,“22”,“33”});


知识点四:数组类的反射

1.具有相同类型和维数的数组属于同一类型,即有相同的Class实例对象

2.数组的字节码文件名是:数组类型的第一个大写字母;例:int为I

3.数组对象的Class的实例对象的getSuperclass()返回的是父类Object类的Class对象

4.基本类型的一维数组可以当做Object类型使用,不能当做Object[]类型使用;非基本类型 的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。

5.Arrays.asList()方法处理int[]和String[]时的差异:1.4和1.5新特性差别。1.4无法处理int数组,返回给1,5处理,1.5将int数组作为一个参数处理

6.数组的反射:Array工具类用于完成数组反射的操作。

                           Array.getLength(Objectobj);//获取数组长度

                           Array.get(Objectobj,intx);// 获取数组中的元素

7.获得某个数组中的某个元素的类型


例:

package Three11;

import java.beans.BeanInfo;

import java.beans.Introspector;

import java.beans.PropertyDescriptor;

import java.io.*;

 

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.net.*;

import java.util.*;

 

class banana{

    private int x;

    private int y;

    public void banana(int x,int y)

    {

      

       this.x=x;

       this.y=y;

    }

}

class apple {

              

    /**

     * @param args

     */

    public static void main(String[] args)throws Exception{

       // TODO Auto-generatedmethod stub

       String str="123456";

       /*知识点一:获取Class对象方法*/

       Class a1=String.class;//通过所有数据类型都有静态属性.class来获取

       Class a2=str.getClass();//通过对象getClass()方法获取

       // Class.forName(包名.类名);

       Class a3=Class.forName("java.lang.String");//通过Class类的静态方法forName()和获得Class对象的类名来获取

       System.out.println((a1==a2));

       System.out.println((a1==a3));

       System.out.println((a2==a3));

      

       /*

        * JAVA中九个预定义的实例对象

        * 基本数据类型(bytebooleanshortintlongdoublefloatchar)字节码对象以及void.class

        * 另外:具有相同的数据类型和维度的数组在java中映射成同一个Class对象

        *判断是否为数组类型,用Class.isArray()方法

        

        * */

       /*知识点二:Constructor类。。。。。构造方法的反射、Constructor的实例对象代表类的一个构造方法

        * constructor类创建实例对象(反射创建)

        * 注意:1.创建newInstance方法中的参数列表必须与Constructor类中的getConstructor()方法中的参数列表一致;

        *       2.每调用一次newInstance方法,即构造一个对象

        *       3.可以指定构造函数

        * */

       //获取一个类中所有的构造方法

       //Constructor[]b1=Class.forName("java.lang.String").getConstructors();

        //获取一个类中的某一个构造方法

       Class b2=Class.forName("java.lang.String");

        Constructor b22=b2.getConstructor(StringBuffer.class);

        //String s1="456";//一般实例化对象

       //Stringb3=(String)constructor.newInstance(new StringBuffer("456"));//通过反射实例化对象

     

       /*

        * Field类。。。。。。(成员变量的反射)

        * 常用的方法:

        *            1.Field getFieldString s);//只能获取该类公有和父类中公有

        *            2.Field getDeclaredFieldString s);//获取该类中任意成员变量,包括私有

        *            3.setAcessible(true);如果是私有字段,要先将私有字段进行取消权限检查的能力。也称暴力访问

        *            4.setObjectobjObject value)将指定对象变量上此Field对象表示的字段设置为指定的新值

        *            5.Object getObjectobj);返回指定对象上Field表示的字段的值

        * */

      

       /*

        * 知识点三:Method类。。。。。。(成员方法的反射):代表某个类中的一个成员方法

        * 常用方法:

        *1.Method[]getMethods();只获取公共和父类中的所有方法

        *2.Method[]getDeclaredMethods();获取本类中方法包含私有方法

        * 3.Medthod[]getMethod("方法名",参数.class(空参可以写null));

        * 4.Object invokeObjectobj,参数);调用方法:如果方法是静态的,invoke中的参数可写为null

        *

        * 通过反射来调用main函数,invoke()方法传递一个字符串数组参数的方法

        * 1.me.invoke(null,newobject[](new String[]{“11”“22”“33”}));

        * 2.me.invoke(null,(Object)newString[]{“11”“22”“33”});

        * */

        String str1="abcd";//实例化str1对象

        //通过反射获取方法

        Method mchar=Class.forName("java.lang.String").getMethod("charAt",int.class);

        //通过invoke方法获取执行charAt里面的功能,当invoke第一个参数为null时,代表调用main函数

        System.out.println(mchar.invoke(str1, 1));

       

         //不清楚类名调用方法,体现了反射功能的强大

        //Methodme=Class.forName("fansge.Test12").getMethod("main",String[].class);

        //me.invoke(null, (Object)new String[]{"aa","bb","cc"});

      

         /*

          * 知识点四:

          *         1.具有相同类型和维数的数组属于同一类型,即有相同的Class实例对象

          *         2.数组的字节码文件名是:数组类型的第一个大写字母;例:intI

          *         3.数组对象的Class的实例对象的getSuperclass()返回的是父类Object类的Class对象

          *         4.基本类型的一维数组可以当做Object类型使用,不能当做Object[]类型使用;非基本类型

          *           的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。

          *         5.Arrays.asList()方法处理int[]String[]时的差异:1.41.5新特性差别。1.4无法处理int数组,

          *           返回给1,5处理,1.5int数组作为一个参数处理

          *         6.数组的反射:Array工具类用于完成数组反射的操作。

                      Array.getLength(Objectobj);//获取数组长度

                      Array.get(Objectobj,intx);// 获取数组中的元素

                    7.获得某个数组中的某个元素的类型

                                                       例:

                         Object[] obj=new Object[]{"ABC",1}                              

          * */

        Object[] obj=new Object[]{"123",1};

        System.out.println("obj=:"+obj);

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值