三、Java中级--4、java反射

1、什么是反射

动态的加载类,在使用的时候加载进内,通过Class.forName("")将其加载。

示例1:


结构

Person类:

package javastudy;

public class Person {
    int age;
    String name;
    public void display(){
        String s=String.format("姓名=%s,年龄=%d",name,age);
        System.out.println(s);
    }
}

Testit:

package javastudy;

public class Testit {

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        // TODO Auto-generated method stub
        Class<?> c=Class.forName("javastudy.Person");  //将Person类加载进进来(内存),此时c相当于是Person;<?>是泛型,理解为通配符
        Person zhang=(Person)c.newInstance();//新建对象,将object转换为Person
        zhang.name="jack";
        zhang.age=20;
        zhang.display();
    }
}

2、反射的其他作用

  • 获得这个类实现了哪些接口 getInterfaces
  • 得到其父类 getSuperclass
  • 得到所有的构造函数 getConstructors
    示例2:得到构造函数


    结构

    Person类

package javastudy;

public class Person {
    int age;
    String name;
    public void display(){
        String s=String.format("姓名=%s,年龄=%d",name,age);
        System.out.println(s);
    }
    public Person(){
        
    }
    public Person(String name,int age){
        this.name=name;
        this.age=age;
    }
}

Testit类

package javastudy;

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

public class Testit {

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        // TODO Auto-generated method stub
        Class<?> c=Class.forName("javastudy.Person");  //将Person类加载进进来(内存),此时c相当于是Person;<?>是泛型,理解为通配符
//      Person zhang=(Person)c.newInstance();//新建对象,将object转换为Person
//      zhang.name="jack";
//      zhang.age=20;
//      zhang.display();
        Constructor<?>[] cons=c.getConstructors();  //数组形式存放Person存在的构造函数,可能包含有多个
        Person wang=(Person) cons[1].newInstance("jerry",30);//取数组中的[1]第2个函数,因此要将Person中定义为public
        wang.display();
    }
}

示例3:得到此类实现了哪些接口
新增加一个interface


结构

Animal接口

package javastudy;

public interface Animal {

}

Person类

package javastudy;
public class Person implements Animal{
    }

Testit类

package javastudy;

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

public class Testit {

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        // TODO Auto-generated method stub
        Class<?> c=Class.forName("javastudy.Person");  //将Person类加载进进来(内存),此时c相当于是Person;<?>是泛型,理解为通配符
        Class<?>[] inter=c.getInterfaces();
        for(int i=0;i<inter.length;i++){
            System.out.println(inter[i].getName());
        }
    }
}

执行结果
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 了解 Java 中的反射 1.1 什么是 Java 的反射 Java 反射是可以让我们在运行时获取类的函数、...
    Ten_Minutes阅读 3,547评论 0 4
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 7,604评论 0 11
  • 一、Class 1、概述: 1、Class是Java程序中各个Java类的总称;它是反射的基石,通过Class类来...
    玉圣阅读 3,146评论 0 2
  • 确实觉得自己磨练不够,需要学习的很多,需要改变的很多,有时也确实会迷茫,不知从何改变,本性难移,说的就是...
    爱花伦的小丸子阅读 1,553评论 0 0
  • 有些东西你急用它时翻箱倒柜寻遍犄角旮旯怎么也找不到,远水又解不了近渇,但还必须用它来解决; 手上扎...
    小城人阅读 3,025评论 0 3