package com.study.reflect;
public class ReflectionDemo01 {
public static void main(String []args) {
//以下都是程序在《《《运行时》》》》
String str="学习java反射机制";
//java为任何类都可以拥有类class生成对应的Class对象
//可以使用 class :1) getClass() 方法 2)返回泛型 getSupperClass返回父类对象
System.out.println(str.getClass()); //class java.lang.String
//反射有以下几种方法加载任何类的对象到JVM中,且通过类加载器加载到内存
//方法一:使用Class<?> cla= xxx.getClass()方法
Integer inte= new Integer(100);
System.out.println(inte.getClass());//class java.lang.Integer
Double doub= new Double(100.0);
System.out.println(doub.getClass());
//方法二:Class.forName(); 运行时加载类到jvm
try{
Class<?> clazz=Class.forName("java.lang.Class"); //返回Class<?>泛型
System.out.println(clazz);
Class<?> cla= Class.forName("java.awt.font.GlyphMetrics");
System.out.println(cla);
}
catch(ClassNotFoundException e) {
e.printStackTrace();
}
//方法三:使用 Class 类名.class 加载
System.out.println(Boolean.class); //class java.lang.Boolean
System.out.println(Thread.class); //class java.lang.Thread
//方法四:使用getSupperClass 返回父类对象 Class类中的方法,返回该Class的父类的Class
//方法五:--运用primitive wrapper classes的TYPE语法: 基本类型包装类的TYPE,如:Integer.TYPE
// 注意:TYPE的使用,只适合原生(基本)数据类型
System.out.println(Integer.TYPE); //int
System.out.println(Double.TYPE); //double
///总结:
///在使用反射的时候,一般使用前三种方法,最常用的也是Class.forName() ,类名.class 作为加载类的
///在程序使用反射中需要有如下的步骤:
//Step 1: 使用Class.forName(),类名.class 加载类到jvm载入内存
//Step 2: 运行时实例化(Instace);实例化类有种实现方式
//A:类的实例化不带参数的构造方法 使用Class类的newInstace()方法直接实例化类。是不带参数的构造方法
//B:类的实例化有带参数的构造方法 使用Constructor类的getConstructor()方法传递参数
//使用带参数的构造方法首先需要准备 Class[] constructor的参数类型
//在使用Class getConstructor() 的专属于Constructor对象
//最后使用Object[] 对象的作为Constructor对象 newInstace()传递实参。
备注注意///
//在这里需要说明的是 只有两个类拥有newInstance()方法,分别是Class类和Constructor类
//Class类中的newInstance()方法是不带参数的,而Constructro类中的newInstance()方法是带参数的
//需要提供必要的参数。
///
//例如:
// Class clazz = Class.forName("TestReflection");
// Class[] classtype= new Class[]{Integer.class,String.class};
// Constructor constr= clazz.getConstructor(classtype);
// Object[] obj= new Object[]{100,"反射的使用带参数"};
// Object objinstace= constr.newInstace(obj);
//System.out.println(objinstace);
//Step 3: 运行时调用Method 方法
//Step 4: 运行时调用Field 方法
}
}