java反射机制学习:初始反射机制
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java反射机制学习:初始反射机制相关的知识,希望对你有一定的参考价值。
本人小白一枚,想和大家一起分享我学习java的笔记和心得。
反射机制:
指的是可以于运行时加载、探知、使用编译期间完全未知的类。
程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;
Class clazz = Class.forName(com.danchel.reflect.User);
加载完类之后,在堆内存中,就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。
我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称为:反射。
Class类是Reflection的根源。
针对任何你想动态加载、运行的类,唯有先获得相应的Class对象。
Class类的对象如何获取?
1、运用getClass();
2、运用Class.forName();
3、运用.class语法。
对象是用来表示和封装一些数据。一个类被加载后,JVM会创建一个对应该类的Class对象,类的整个结构信息会放到对应的Class对象中。
这个Class对象就像一面镜子一样,通过这面镜子我可以看到对应类的全部信息。
反射机制的核心就是此处的Class对象。
注意:同一个类,只会被加载一次(hashcode的值相同)。
Class clazz1=Class.forName(com.danchel.reflect.User);
System.out.println(clazz.hashCode());
Class clazz2=Class.forName(com.danchel.reflect.User);
System.println(clazz2.hashCode());
应用反射的API,获取类的信息(名字,属性,方法,构造器等)
//获取类的名字
System.out.println(clazz.getName()); //获取包括包名的类的名字
System.out.println(clazz.getSingleName()); //只获取类的名字,不包括包名
package com.danchel.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Demo02 {
public static void main(String[] args) {
String path = "com.danchel.reflect.User";
try {
Class clazz =Class.forName(path);
System.out.println(clazz.getName());//获取类的名字,包括包名
System.out.println(clazz.getSimpleName()); //只获取类的名字,不包括包的名字
Field[] fields2 =clazz.getFields(); //获得所有的访问权限为public的属性,访问权限为protected,default,private的属性不能获取
Field[] fields=clazz.getDeclaredFields();//获得所有的属性,不受访问权限限制
Field field =clazz.getDeclaredField("name");//获得单个属性,不受访问权限限制,参数是该对象要获取的属性名的字符串形式
System.out.println(field);
for(Field f:fields){
System.out.println("属性:"+f);
}
clazz.getMethods();//获得所有的访问权限为public的方法
Method[] methods =clazz.getDeclaredMethods();
Method method=clazz.getDeclaredMethod("setName", String.class);//获得单个方法,第一个参数是该对象要获取的方法名的字符串形式,第二个参数是该方法需要传进来的参数的类型.class
for(Method temp:methods){
System.out.println("方法:"+temp);
}
Constructor[] constructors=clazz.getDeclaredConstructors();
Constructor c = clazz.getDeclaredConstructor(String.class,String.class,int.class);//获得某一个构造器,参数是构造器需要传进来的参数的类型.class
System.out.println(c);
for (Constructor constructor : constructors) {
System.out.println("构造器:"+constructor);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
以上是关于java反射机制学习:初始反射机制的主要内容,如果未能解决你的问题,请参考以下文章