Java 反射机制

Java 反射机制

只是学习笔记,如果有错误,请在评论区指出,谢谢

1.通过实例化对象获取类信息

​ 范例

package com.yyr.反射机制;

public class InfoClass {
    public static void main(String[] args) {
        String str=new String("hello ");//通过类产生实例对象
        System.out.println(str.getClass());//通过实例对象获取类信息
    }
}

结果

class java.lang.String

2.class对象的三张实例化模式

反射的核心操作都是通过class类对象展开的,class类是反射操作的根源所在,想获取class的实例化对象有三种方式:

  • Objec支持

    package com.yyr.反射机制;
    class  Person{}
    public class InfoClass {
        public static void main(String[] args) {
            //Object支持
            Person per =new Person();
            Class<? extends Person> cls=per.getClass();
            System.out.println(cls);
        }
    }
    
    
class com.yyr.反射机制.Person
  • JVM支持,通过类.class获取

    package com.yyr.反射机制;
    import javax.swing.*;
    
    class  People{}
    public class InfoClass {
        public static void main(String[] args) {
            //JVM直接支持,采用类.class的形式实例化
            Class<? extends People> cl=People.class;
            System.out.println(cl);
        }
    }
    
    
    class com.yyr.反射机制.People
    
  • ​ Class类支持,

package com.yyr.反射机制;

import javax.swing.*;

class  Person{}
class  Student{}
class  People{}
public class InfoClass {
    public static void main(String[] args) throws ClassNotFoundException {
        //Class类支持,
        Class<?> clss =Class.forName("com.yyr.RandomTest.RandomTest");//写好类的路径
        System.out.println(clss);

    }
}

class com.yyr.RandomTest.RandomTest
获取实例化对象,就可以利用这个对象区调用那个类的方法,减少耦合,减少不必要的代码,妙啊
二、反射类获取类结构

1、获取包名:

        Class<?> c =Class.forName("com.yyr.RandomTest.RandomTest");
        Package pak=c.getPackage();
        System.out.println(pak);

2、获得父类

        Class<?> c =Class.forName("com.yyr.RandomTest.RandomTest");
        Class<?> parent=c.getSuperclass();
        System.out.println(parent.getName());

3、获取父接口

class  Person implements IMb{
    @Override
    public void run() {
        System.out.println("");
    }
}             
public class InfoClass {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
  Class<? > cl=People.class;
        Class<? > clazz[]=cl.getInterfacce();
        for(Class<?>temp:clazz){
         System.out.println(temp.getName());
        }
        }

结果

com.yyr.反射机制.IMb
三、反射调用构造方法
  //获取全部构造方法
        Class<?> cll=Person.class;
       Constructor<?>[] constructors=cll.getDeclaredConstructors();
       for(Constructor <?>con: constructors){
           System.out.println(con+"构造方法");
       }

四、反射调用普通方法

1、进行反射处理的时候可以通过反射来获取类之中的全部方法,但是有一个前提条件:类之中必须提供有实例化对象

范例1:获取全部方法

package com.yyr.反射机制.反射获取类结构信息;

import  java.lang.String;
import java.lang.reflect.Method;

public class ClassRegflect {
    public static void main(String[] args) {
        Class<?> cls=String.class;//获取指定类的Class对象
        {
            //获取全部方法
            Method methods[]=cls.getMethods();
            for (Method met:methods){
                System.out.println(met);
            }
        }

    }
}

输出

截取部分
public boolean java.lang.String.equals(java.lang.Object)
public int java.lang.String.length()
public java.lang.String java.lang.String.toString()
public int java.lang.String.hashCode()
public void java.lang.String.getChars(int,int,char[],int)
public int java.lang.String.compareTo(java.lang.String)
public int java.lang.String.compareTo(java.lang.Object)
public int java.lang.String.indexOf(java.lang.String,int)
public int java.lang.String.indexOf(int)
public int java.lang.String.indexOf(int,int)
public int java.lang.String.indexOf(java.lang.String)
public static java.lang.String java.lang.String.valueOf(int)
public static java.lang.String java.lang.String.valueOf(float)
public static java.lang.String java.lang.String.valueOf(boolean)
public static java.lang.String java.lang.String.valueOf(long)
public static java.lang.String java.lang.String.valueOf(double)
public static java.lang.String java.lang.String.valueOf(java.lang.Object)
public static java.lang.String java.lang.String.valueOf(char)
public static java.lang.String java.lang.String.valueOf(char[])
public static java.lang.String java.lang.String.valueOf(char[],int,int)
public java.util.stream.IntStream java.lang.String.codePoints()

范例2:获取本类方法

package com.yyr.反射机制.反射获取类结构信息;

import  java.lang.String;
import java.lang.reflect.Method;

public class ClassRegflect {
    public static void main(String[] args) {
        Class<?> cls = String.class;//获取指定类的Class对象
        {//获取本类方法
            Method methods[] = cls.getDeclaredMethods();
            for (Method met : methods) {
                System.out.println(met);

            }
        }
    }
}
截取部分
byte[] java.lang.String.value()
public boolean java.lang.String.equals(java.lang.Object)
public int java.lang.String.length()
public java.lang.String java.lang.String.toString()
public int java.lang.String.hashCode()
public void java.lang.String.getChars(int,int,char[],int)
public int java.lang.String.compareTo(java.lang.String)
public int java.lang.String.compareTo(java.lang.Object)
public int java.lang.String.indexOf(java.lang.String,int)
public int java.lang.String.indexOf(int)

结论:这个时候的方法信息的获取是依靠Method类提供的toString()方法完成的。

五、获取成员

同样是通过Class类完成、

范例1、获取父类之中的公共成员的信息

Class<?> cl=Class.forName("java.lang.String");
 Field fields []=cl.getFields();//获取成员
 for(Field fie:fields){
     System.out.println(fie);
public static final java.util.Comparator java.lang.String.CASE_INSENSITIVE_ORDER

范例2:获取子类中的公共信息

              //获取父类之中的公共成员信息
                Class<?> c = Class.forName("java.lang.String");
                Field fiels[] = cl.getDeclaredFields();//获取成员
                for (Field fie : fiels) {
                    System.out.println(fie);
private final byte[] java.lang.String.value
private final byte java.lang.String.coder
private int java.lang.String.hash
private static final long java.lang.String.serialVersionUID
static final boolean java.lang.String.COMPACT_STRINGS
private static final java.io.ObjectStreamField[] java.lang.String.serialPersistentFields
public static final java.util.Comparator java.lang.String.CASE_INSENSITIVE_ORDER
static final byte java.lang.String.LATIN1
static final byte java.lang.String.UTF16
六、unsafe工具

1、用反射获取对象。可以绕过JVM的相关对象的管理机制,一旦使用了Unsafe类,将不能再使用JVM的内存管理机制以及垃圾回收处理。

2、构造方法 :Unsafe()

​ 私有常量:private static final Unsafe theUnsafe=new Unsafe()

不能通过类似的单例设计模式来对static的属性进行操作,如果要获得这个常量,还是通过反射机制获取

范例:通过反射机制获取私有常量。

package com.yyr.反射机制.反射获取类结构信息;
import sun.misc.Unsafe;
import java.lang.reflect.Field;

//通过反射机制获取Unsafe的私有常量
public class UnsafeClass {
    public static void main(String[] args) throws  Exception {
        Field field= Unsafe.class.getDeclaredField("theUnsafe");
       field.setAccessible(true);//解除封装处理
        Unsafe unsafeObject=(Unsafe) field.get(null);//static属性不需要传递实例化对象
     //利用Unsafe类绕过了JVM的管理机制,可以再没有对象的情况下获得一个Singleyon实例化对象
    Singleyon instance=(Singleyon) unsafeObject.allocateInstance(Singleyon.class);
        instance.print();
    }
}
class  Singleyon{
    private  Singleyon(){
        System.out.println("******Singleyon构造方法***");
    }
    public  void print(){
        System.out.println("www.mkn.com");
    }
}
www.mkn.com

Unsafe的作用:绕过实例化对象的管理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值