• Java反射机制(创建Class对象的三种方式)


    1:了解什么是反射机制?
    在通常情况下,如果有一个类,可以通过类创建对象;但是反射就是要求通过一个对象找到一个类的名称;
     
    2:在反射操作中,握住一个核心概念:
    一切操作都将使用Object完成,类,数组,的引用都可以使用Object进行接收;
     
    3:Class类:
    功能:
    通过一个实例化对象,找到一个类的完整信息;
     
    public final class Class<T>
    extends Object
    package cn.itcast;
    
    //声明X类
    class X {
         
    }
    public class ClassDemo01 {
         public static void main(String[] args) {
               //实例化X类对象
              X x = new X();
               //得到对象所在的类
              System. out.println(x.getClass().getName());
         }
    }
    
    打印结果:cn.itcast.X(包名.类)
    

      

    1:get.Class()方法:
    任何一个类如果没有声明继承自那个父类,默认继承Object类;
    返回Object运行时的类,返回值是Class类,此类就是反射的源头;
    public final Class<?> getClass()
     
    2:getName()方法:
    public String getName()
    String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称;
     
    3:传统方式和反射方式:
     
    传统方式:
    引入“包.类”的名称  ----- 通过new实例化  ------ 创建实例化对象
     
    反射方式:
    实例化对象  -----  getClass() ---- 得到完整的“包.类”名称
     
    4:结论
    所有类的对象实际上都是Class类的实例;
    package cn.itcast;
    
    public class Person {
    	private String name;
    	private int age;
    	private char sex;
    
    	public Person() {
    		super();
    	}
    
    	public Person(String name, int age, char sex) {
    		super();
    		this.name = name;
    		this.age = age;
    		this.sex = sex;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public int getAge() {
    		return age;
    	}
    
    	public void setAge(int age) {
    		this.age = age;
    	}
    
    	public char getSex() {
    		return sex;
    	}
    
    	public void setSex(char sex) {
    		this.sex = sex;
    	}
    
    	@Override
    	public String toString() {
    		return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
    	}
    
    }
    

      

    5:创建Class对象的三种方式:
    
    
    package cn.itcast; public class ClassDemo02 { public static void main(String[] args) { Person p1 = new Person("小明" ,20,'男' ); Person p2 = new Person("小红" ,23,'女' ); //创建Class对象的方式一:(对象.getClass()) Class class1 = p1.getClass(); System. out.println(p1.getClass().getName()); Class class2 = p2.getClass(); System. out.println(class1 == class2 ); System. out.println("==============================" ); //创建Class对象的方式二:(类.class:需要输入一个明确的类) Class class3 = Person.class; System. out.println(class1 == class2); System. out.println("==============================" ); //创建Class对象的方式三:(forName():传入时只需要以字符串的方式传入即可) //Class.forName()有异常:ClassNotFoundException Class class4 = null; try { class4 = Class. forName("cn.itcast.Person"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } System. out.println(class4 == class3); } } 结论: Class类不能使用new来实例化对象,代表类的字节码.相同类别的对象的类字节码相同 一个Class对象代表着一份字节码,相同类型的对象得到的字节码对象是同一个

      

  • 相关阅读:
    Unity3d Android SDK接入
    Unity打包IOS和Android以及之间的交互
    Gradle
    General error: 1205 Lock wait timeout exceeded; try restarting transaction的解决办法
    kubeadm init [ERROR ImagePull]: failed to pull image [k8s.gcr.io/kube-apiserver-amd64:v1.11.3]: exit status 1
    yum安装kubectl时报错
    PhpStorm激活码 2020年3月亲测可用
    Vmware 14 安装 Vmware Tools 并配置宿主机共享文件给Vmware中Centos7系统
    期权
    对冲-风险对冲
  • 原文地址:https://www.cnblogs.com/qlwang/p/5645618.html
Copyright © 2020-2023  润新知