java_反射

反射1
    反射的概念
    反射能实现的功能
    Class类详解
    
    反射的概念
        Reflection,它是一种在程序运行时可以将其状态作为数据进行查询与修改的能力。
        java语言对查询支持更好,别的语言也支持反射。java对修改支持不是很好。
    反射能实现的功能
        有类名,可以获取:
        有引用,可以
    Class类详解
        反射的核心
        该类来自java.lang包,而且是一个泛型类
        在运行时可以使用它发现类的所有信息
        一个jvm中每一个加载的类只会有一个Class对象
        
        获取Class的实例
            类的class静态属性(字面量)
            实例的getClass()方法
            使用其静态方法forName()方法

 

package java20180205_2;

class User {
    static {
        System.out.println("user init ...");
    }
}

public class ReflectionDemo1 {
    static void create1() {
        new User();
    }

    static void create2() {
        Class<User> c = User.class;
    }

    static void create3() {
        try {
            Class c = Class.forName("java20180205_2.User");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    static void create4() {
        try {
            Class c = Class.forName("java20180205_2.User", false, ReflectionDemo1.class.getClassLoader());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {

        create4();

        /**
         * 第一种方法
         */
        Class<String> c1 = String.class;

        /**
         * 第二种方法
         */
        String s = "";
        Class<?> c2 = s.getClass();

        /**
         * 第三种方法
         */
        try {
            Class<?> c3 = Class.forName("java.lang.String");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

}

 

反射2
    获取包的信息
    获取类的信息
    获取属性的信息
    
    
    获取包的信息
        java.lang.Package
        
        String getName()
        static Package getPackage(String name)
        static Package[] getpackage()
    获取属性的信息
        java.lang.reflect.Field
        
        Field[] getFields()//得到的是所有的public属性
        Field[] getDeclaredFields()//得到所有但不包括继承而来的
        Field getField(String name)
        Field getDeclaredField(String name)

 

获取包及类信息

package java20180205_2;

import java.io.Serializable;
import java.lang.reflect.Modifier;

abstract class Person extends Thread implements Serializable,Runnable{
    
}

public class PackageInfo {

    public static void main(String[] args) {
//
//        Package p=Package.getPackage("java.lang");
//        System.out.println(p.getName());
        
        Package[] ps=Package.getPackages();
        for (Package p1 : ps) {
        
            System.out.println(p1.getName());
        }
        System.out.println("============================");
        Class<Person> c1=Person.class;
        //下面是全限定名
        System.out.println(c1.getName());
        //下面只有类名
        System.out.println(c1.getSimpleName());
        System.out.println(c1.getPackage().getName());
        System.out.println(c1.isPrimitive());
        System.out.println(c1.isInterface());
        System.out.println(int.class.isPrimitive());
        System.out.println("============================");
        //得到类本身的信息及父类和父接口的信息
        Class<?> sc=c1.getSuperclass();
        System.out.println(sc.getName());
        
        Class<?>[] sc1=c1.getInterfaces();
        for (Class<?> class1 : sc1) {
            System.out.println(class1.getName());
        }
        System.out.println("============================");
//        int mod=c1.getModifiers();
        int mod=Serializable.class.getModifiers();
        System.out.println(Modifier.toString(mod));
        System.out.println(c1.toGenericString());
        
    }

}

 

获取字段信息

package java20180205_2;

import java.lang.reflect.Field;

interface interface1{
    int NUM=10;
}

class class1{
    int num1;
    public String name;
}
class MyClass extends class1 implements interface1{
    int num2;
    public int num3;
    private int num4;
}

public class FieldInfo {

    public static void main(String[] args) {

        Class<MyClass> c=MyClass.class;
        Field[] fields=c.getFields();
        for (Field field : fields) {
            System.out.println(field.getName());
        }
        System.out.println("===================");
        Field[] fields2=c.getDeclaredFields();
        for (Field field : fields2) {
            System.out.println(field.getName());
        }
        System.out.println("===================");
        try {
            Field field3=c.getField("NUM1");
        } catch (NoSuchFieldException | SecurityException e) {
            e.printStackTrace();
        }
        System.out.println("===================");
        try {
            Field field4=c.getDeclaredField("num2");
        } catch (NoSuchFieldException | SecurityException e) {
            e.printStackTrace();
        }
    }

}

 

反射3
    获取方法的信息
    获取构造方法的信息
    
    java.lang.reflect.Method
    
    Method[] getMethods()
    Method[] getDeclaredMethods()
    Method getMethod(String name,Class... parameterTypes)
    Method getDeclaredMethod(String name,Class... parameterTypes)

package java20180205_2;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

abstract class Class2{
    public Class2(){
        
    }
    public void m1(){
    }
    public void m1(int num,String str){
        
    }
    void m2(){
    }
    static void m3(){
    }
    abstract void m4();
}

public class MethodInfo {

    public static void main(String[] args) {

        Class<Class2> c1=Class2.class;
        //得到这个类中所有public的方法,默认的与private的都不行
        Method[] m1=c1.getMethods();
        for (Method method : m1) {
            System.out.println(method.getName());
        }
        System.out.println("==============");
        //得到这个类中所有声明的方法
        Method[] m2=c1.getDeclaredMethods();
        for (Method method : m2) {
            System.out.println(method.getName());
        }
        System.out.println("==============");
        try {
//            Method c2=c1.getDeclaredMethod("m1");
//            Method c2=c1.getDeclaredMethod("m1",int.class);
            Method c2=c1.getDeclaredMethod("m1",int.class,String.class);
            System.out.println(c2.getName());
        } catch (NoSuchMethodException | SecurityException e) {
            e.printStackTrace();
        }
        System.out.println("==============");
        Constructor<?>[] c3=c1.getConstructors();
        for (Constructor<?> constructor : c3) {
            System.out.println(constructor.getName());
            System.out.println(constructor.getModifiers());
        }
    }
}

 

       
反射4
    通过反射创建对象
    调用对象的方法
    调用对象的属性
       

 

转载于:https://www.cnblogs.com/createyuan/p/8421190.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值