反射学习

import java.util.Random;

/**
 * 学习反射
 * Class类对象获取的三种方式
 */
public class Test {
    public static void main(String[] args) {
        /*
          获取类对象的多种方式。Class类在jdk1.5以后是Class<T>泛型类
          1.Object 类中的 getClass( ) 方法
         */
        Random random = new Random();
        Class<? extends Random> aClass = random.getClass();
        System.out.println(aClass.getName());
        /*
          2.Class的forName的静态方法得到类名对应类的class的一个实例
          调用静态方法 forName 获得类名对应的 Class 对象
         */
        String className = "java.util.Random";
        try {
            Class<?> aClass1 = Class.forName(className);
            System.out.println(aClass1);
            System.out.println(aClass1.getName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        /*
          3.获得 Class类对象的第三种方法非常简单。如果 T 是任意的 Java 类型(或 void 关键字)
          T.class 将代表匹配的类对象
          换成通俗的说法就是对应的类直接.class,就可以获取该类的class对象
         */
        Class<Random> randomClass = Random.class;
        System.out.println(randomClass.getName());
    }
}

结果运行图:

有个特殊的地方就是,基本数据类型也有Class对象,比如int。

public class Test2 {
    public static void main(String[] args) {
        /*
        请注意,一个 Class 对象实际上表示的是一个类型,而这个类型未必一定是一种类。例如,
        int 不是类, 但 int.class 是一个 Class 类型的对象
         */
        System.out.println(int.class.getName());
        System.out.println(Integer.class.getName());
        System.out.println(int[].class.getName());
        System.out.println(Integer[].class.getName());
    }
}

import java.util.Random;

public class Test3 {
    public static void main(String[] args) {
        String s = "java.util.Random";
        try {
            //实际上是使用该类的无参构造去实例化,如果没有无参构造
            Random o = (Random) Class.forName(s).newInstance();
            System.out.println(o.nextInt(100));
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

下面是一个程序利用反射打印出一个类的内部结构 ,先看api

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;

/**
 * 该程序利用反射打印一个类的内部结构
 */
public class ReflectionTest {
    public static void main(String[] args) {
        String  className ;
        if(args.length>0){
            className = args[0];
        }else {
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入一个完整的类名:(如:java.util.Scanner)");
            className = scanner.next();
        }
        try {
            Class<?> aClass = Class.forName(className);
            Class<?> superclass = aClass.getSuperclass();
            String modifier = Modifier.toString(aClass.getModifiers());
            if (modifier.length()>0){
                System.out.print(modifier);
            }
            System.out.print(" class "+aClass.getName());
            if(superclass!=null&&superclass!=Object.class) {
                System.out.print(" extends " +superclass.getName());
            }
            System.out.print("\n{\n");
            printConstructors(aClass);
            System.out.println();
            printFields(aClass);
            System.out.println();
            printMethods(aClass);
            System.out.println("}");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /*
    打印方法函数
     */
    private static void printMethods(Class<?> aClass) {
        Method[] methods = aClass.getMethods();
        for (Method method : methods) {
            System.out.print("    ");
            String name = method.getName();
            String modifiers = Modifier.toString(method.getModifiers());
            Class<?> returnType = method.getReturnType();
            Class<?>[] parameterTypes = method.getParameterTypes();
            if(modifiers.length()>0) {
                System.out.print(modifiers+" ");
            }
            System.out.print(returnType+" "+name+"(");
            String parameterString = "";
            for (Class<?> parameterType : parameterTypes) {
                parameterString +=parameterType.getName()+",";
            }
            if(parameterString.length()>0){
                parameterString = parameterString.substring(0,parameterString.length()-1);
            }
            System.out.print(parameterString+")"+";");
            System.out.println();
        }
    }

    /*
    打印域
     */
    public static void printFields(Class<?> aClass) {
        Field[] declaredFields = aClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.print("    ");
            String name = declaredField.getName();
            String modifiers = Modifier.toString(declaredField.getModifiers());
            Class<?> type = declaredField.getType();
            if(modifiers.length()>0){
                System.out.print(modifiers+" ");
            }
            System.out.print(type.getName()+" "+name+";");
            System.out.println();
        }
    }

    /*
    打印构造方法
     */
    public static void printConstructors(Class<?> aClass) {
        Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();
        for (Constructor<?> constructor : declaredConstructors) {
            String name = constructor.getName();
            System.out.print("    ");
            String modifiers = Modifier.toString(constructor.getModifiers());
            if(modifiers.length()>0){
                System.out.print(modifiers+" ");
            }
            System.out.print(name+"(");
            Class<?>[] parameterTypes = constructor.getParameterTypes();
            String parameterString = "";
            for (Class<?> parameterType : parameterTypes) {
                parameterString +=parameterType.getName()+",";
            }
            if(parameterString.length()>0){
                parameterString = parameterString.substring(0,parameterString.length()-1);
            }
            System.out.print(parameterString+");");
            System.out.println();
        }
    }
}
运行结果:
请输入一个完整的类名:(如:java.util.Scanner)
java.util.Scanner
public final class java.util.Scanner
{
    private java.util.Scanner(java.nio.file.Path,java.nio.charset.Charset);
    public java.util.Scanner(java.io.InputStream,java.lang.String);
    public java.util.Scanner(java.io.InputStream);
    public java.util.Scanner(java.nio.file.Path);
    private java.util.Scanner(java.lang.Readable,java.util.regex.Pattern);
    private java.util.Scanner(java.io.File,java.nio.charset.CharsetDecoder);
    public java.util.Scanner(java.io.File,java.lang.String);
    public java.util.Scanner(java.io.File);
    public java.util.Scanner(java.nio.file.Path,java.lang.String);
    public java.util.Scanner(java.nio.channels.ReadableByteChannel,java.lang.String);
    public java.util.Scanner(java.lang.Readable);
    public java.util.Scanner(java.nio.channels.ReadableByteChannel);
    public java.util.Scanner(java.lang.String);

    private java.nio.CharBuffer buf;
    private static final int BUFFER_SIZE;
    private int position;
    private java.util.regex.Matcher matcher;
    private java.util.regex.Pattern delimPattern;
    private java.util.regex.Pattern hasNextPattern;
    private int hasNextPosition;
    private java.lang.String hasNextResult;
    private java.lang.Readable source;
    private boolean sourceClosed;
    private boolean needInput;
    private boolean skipped;
    private int savedScannerPosition;
    private java.lang.Object typeCache;
    private boolean matchValid;
    private boolean closed;
    private int radix;
    private int defaultRadix;
    private java.util.Locale locale;
    private sun.misc.LRUCache patternCache;
    private java.io.IOException lastException;
    private static java.util.regex.Pattern WHITESPACE_PATTERN;
    private static java.util.regex.Pattern FIND_ANY_PATTERN;
    private static java.util.regex.Pattern NON_ASCII_DIGIT;
    private java.lang.String groupSeparator;
    private java.lang.String decimalSeparator;
    private java.lang.String nanString;
    private java.lang.String infinityString;
    private java.lang.String positivePrefix;
    private java.lang.String negativePrefix;
    private java.lang.String positiveSuffix;
    private java.lang.String negativeSuffix;
    private static volatile java.util.regex.Pattern boolPattern;
    private static final java.lang.String BOOLEAN_PATTERN;
    private java.util.regex.Pattern integerPattern;
    private java.lang.String digits;
    private java.lang.String non0Digit;
    private int SIMPLE_GROUP_INDEX;
    private static volatile java.util.regex.Pattern separatorPattern;
    private static volatile java.util.regex.Pattern linePattern;
    private static final java.lang.String LINE_SEPARATOR_PATTERN;
    private static final java.lang.String LINE_PATTERN;
    private java.util.regex.Pattern floatPattern;
    private java.util.regex.Pattern decimalPattern;
    static final boolean $assertionsDisabled;

    public void remove();
    public class java.lang.String toString();
    public boolean hasNext();
    public boolean hasNext(java.lang.String);
    public boolean hasNext(java.util.regex.Pattern);
    public class java.lang.String next();
    public volatile class java.lang.Object next();
    public class java.lang.String next(java.util.regex.Pattern);
    public class java.lang.String next(java.lang.String);
    public void close();
    public class java.util.Scanner reset();
    public class java.util.Scanner skip(java.util.regex.Pattern);
    public class java.util.Scanner skip(java.lang.String);
    public int nextInt(int);
    public int nextInt();
    public double nextDouble();
    public interface java.util.regex.MatchResult match();
    public class java.util.Locale locale();
    public class java.util.regex.Pattern delimiter();
    public class java.lang.String findInLine(java.util.regex.Pattern);
    public class java.lang.String findInLine(java.lang.String);
    public class java.lang.String findWithinHorizon(java.util.regex.Pattern,int);
    public class java.lang.String findWithinHorizon(java.lang.String,int);
    public boolean hasNextBigDecimal();
    public boolean hasNextBigInteger();
    public boolean hasNextBigInteger(int);
    public boolean hasNextBoolean();
    public boolean hasNextByte(int);
    public boolean hasNextByte();
    public boolean hasNextDouble();
    public boolean hasNextFloat();
    public boolean hasNextInt(int);
    public boolean hasNextInt();
    public boolean hasNextLine();
    public boolean hasNextLong(int);
    public boolean hasNextLong();
    public boolean hasNextShort();
    public boolean hasNextShort(int);
    public class java.io.IOException ioException();
    public class java.math.BigDecimal nextBigDecimal();
    public class java.math.BigInteger nextBigInteger();
    public class java.math.BigInteger nextBigInteger(int);
    public boolean nextBoolean();
    public byte nextByte();
    public byte nextByte(int);
    public float nextFloat();
    public class java.lang.String nextLine();
    public long nextLong(int);
    public long nextLong();
    public short nextShort(int);
    public short nextShort();
    public int radix();
    public class java.util.Scanner useDelimiter(java.lang.String);
    public class java.util.Scanner useDelimiter(java.util.regex.Pattern);
    public class java.util.Scanner useLocale(java.util.Locale);
    public class java.util.Scanner useRadix(int);
    public final void wait();
    public final void wait(long,int);
    public final native void wait(long);
    public boolean equals(java.lang.Object);
    public native int hashCode();
    public final native class java.lang.Class getClass();
    public final native void notify();
    public final native void notifyAll();
    public void forEachRemaining(java.util.function.Consumer);
}

下面是反射得到对象的域值和设置域值,还有方法的调用

 

 

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test5 {
    public static void main(String[] args) {
        Student student = new Student("小明",80);
        Field name = null;

        try {
            name = Student.class.getDeclaredField("name");
            name.setAccessible(true);
            System.out.println(name.get(student));
            name.set(student,"小李");
            Method toString = Student.class.getMethod("toString");
            System.out.println(toString.invoke(student));
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值