Class类及反射2

总结 :

为什么要有Class类及反射  :Java 强类型语言,但是我们在运行时有了解、修改信息的需求,包括类信息、成员信息以及数组信息。

目前我就知道 这个是用来修改程序的  就是当程序发布的时候 方便快速的去网上下载程序的工具包   然后是编译不了的还是啥的 我也不懂  就是通过反射可以访问一些平时访问不到的东西  如私有变量也是可以访问的

简单总结一下   

   这里主要是以下几个类

Class       Constructor        Method      Filed   (类     构造方法    方法     成员变量)

后三个类都位于反射包下   继承自同一个类
 

Class类位于这里

接下来讲一下怎么去使用    :

首先要获取Class对象     有好几种方法    如下

算了  看书吧1 或看这里  https://blog.csdn.net/liu_c_y/article/details/51815279有说三种方法  我总结下吧

.class方法对于引用类型和基本类型都可以  

getClass只能对象使用  及引用类型使用

重点哈  获取class 见这篇文章https://blog.csdn.net/qq_21808961/article/details/80381989  懒得打字了

然后这些事   Class类里的方法可以获取的信息

然后就利用那后三个类   构造方法类   方法类   成员变量类   

通过  Class里的方法的返回值创建相应的类的对象  然后  后三个类里面也是有方法的哦  具体就不细说了  去查Api

就可以通过后三个类里面的方法进行一些操作与访问   同时也可以用Class类来数组配合 

例子如下

package FanShe;

public class MoreCoustracter {
    String name;
    int id;
    int age;
    int height;
    public MoreCoustracter() {
        super();
        // TODO 自动生成的构造函数存根
    }
    private MoreCoustracter(String name) {
        super();
        this.name = name;
    }    
    public MoreCoustracter(String name, int id, int age, int height) {
        super();
        this.name = name;
        this.id = id;
        this.age = age;
        this.height = height;
    }
    public MoreCoustracter(String name, int id, int age) {
        super();
        this.name = name;
        this.id = id;
        this.age = age;
    }

    
    public MoreCoustracter(String ...strings) {
        if(strings.length>3){
            id=Integer.valueOf(strings[0]);
        }
    }
    public void print(){
        System.out.println("测试Class类和Java反射");
    }
}
 

package FanShe;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;

import javax.naming.directory.ModificationItem;
import javax.swing.OverlayLayout;

public class TestCoustractor {
    public static void main(String[] args) {//1:class获取类对象  :2:  通过类对象获取构造方法的构造类对象 3:通过构造类对象使用构造方法中得到一些方法返回给Class对象里的数组
        Class c=MoreCoustracter.class;
        Constructor[] declaredConstructor=c.getDeclaredConstructors();
        for(int i=0;i<declaredConstructor.length;i++){
            Constructor h=declaredConstructor[i];
            System.out.println("查看是否允许带有可变数量的参数:"+h.isVarArgs());
            System.out.println("该构造方法的入口参数类型依次是:");
            Class []parameterTypes=h.getParameterTypes();
            for(int i1=0;i1<parameterTypes.length;i1++){
                System.out.println(" "+parameterTypes[i1]);
            }
            System.out.println("该构造方法可能抛出的异常类型为:");
            Class []exceptionTypes=h.getExceptionTypes();
            for(int i1=0;i<exceptionTypes.length;i1++){
                System.out.println(" "+exceptionTypes[i1]);
            }
            MoreCoustracter m=new MoreCoustracter();
            while(m==null){
                try {
                    if(i>1){
                        m=(MoreCoustracter)h.newInstance();
                    }else if(i==1){
                        m=(MoreCoustracter)h.newInstance("7",5);
                    }else{
                        Object[] paramenters=new Object[]{new String[]{"100","200","300"}};
                        m=(MoreCoustracter)h.newInstance(paramenters);
                    }
                } catch (Exception e) {
                    // TODO 自动生成的 catch 块
                    System.out.println("在创建对象时抛出异常,下面执行setAccessible方法");
                    h.setAccessible(true);//设为允许访问
//                    e.printStackTrace();
                }
            }
            m.print();
            System.out.println();
        }
        try {
            Constructor t=c.getDeclaredConstructor(String.class);
            Class[] paraments=t.getParameterTypes();
            System.out.println(" "+paraments[0]);
            int f=t.getModifiers();
            System.out.println(Modifier.isPublic(f));
            System.out.println(Modifier.toString(f));
        } catch (NoSuchMethodException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }
}
 

v

猜你喜欢

转载自blog.csdn.net/qq_42384510/article/details/81370185