码迷,mamicode.com
首页 > 编程语言 > 详细

java反射机制学习:初始反射机制

时间:2017-08-27 13:34:28      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:lan   static   运行时   protect   sim   表示   机制   创建   trace   

  本人小白一枚,想和大家一起分享我学习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反射机制学习:初始反射机制

标签:lan   static   运行时   protect   sim   表示   机制   创建   trace   

原文地址:http://www.cnblogs.com/danchel/p/7440119.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!