package com.gh.ref;

 public class Person {
private String name;
private int age;
private char sex;
private void say(){
System.out.println("我是"+name);
}
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;
}
public String toString() {
return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
public Person(String name, int age, char sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
System.out.println("调用Person有参构造方法");
}
public Person() {
super();
System.out.println("调用Person无参构造方法");
} }
 package com.gh.ref;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
/**
* 反射
* @author ganhang
*/
public class RefDemo {
public static void main(String[] args) throws Exception {
Person p=new Person("小白",18,'男');
Person p1=new Person("小黑",10,'女');
//创建Class对象方法一
Class personClass=p.getClass();
Class personClass1=p1.getClass();
System.out.println(personClass==personClass1);
/**
* true是因为java虚拟机先把Person.class通过类加载器加载到内存,加载到内存就是以Class类型存在的
* 但是两个对象只加载一次Person,所以他们的内存地址是 一样的;这和instanceof的功能本质一样
*/
//创建Class对象方法二
Class personClass3=Person.class;//一个Class对象代表一份字节码,相同类型的对象的字节码是一样的
System.out.println(personClass3==personClass1);
//int.class;
//void.class;
//创建Class对象方法三
Class personClass4=Class.forName("com.gh.ref.Person");//可能类找不到会抛异常,注意加包名
System.out.println(personClass4==personClass1);
//--------通过类信息实例化对象--------
//调用无参构造方法
Person p3;
try {
p3 = (Person)personClass4.newInstance();
System.out.println(p3);//因为调用无参构造所以全为空,如果类中没有无参构造方法将会报异常
} catch (InstantiationException | IllegalAccessException e1) {
e1.printStackTrace();
}
//调用有参构造方法
Constructor[] cons= personClass4.getConstructors();//获得当前类的所以构造方法
Person p4=null;
try {
//传指定参数的Class对象
Constructor c=personClass4.getConstructor(String.class,int.class,char.class);
p4=(Person) c.newInstance("小花",18,'女');
System.out.println(p4);
} catch (Exception e) {
e.printStackTrace();
}
//----------通过类取得类信息-------
System.out.println("包信息:"+personClass.getPackage().toString());//返回一个包类
System.out.println("类名:"+personClass.getName());
//获取类的方法信息
Method[] ms=personClass.getMethods();
/**
* 返回一个包含某些 Method 对象的数组,
* 这些对象反映此 Class 对象所表示的类或接口
*(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法
* 如果只要本类自己定义方法(包括私有)可以用getDeclaredMethods()
*/
for (Method m : ms) {
//获取访问修饰符返回的是数字,需要Modifier来转
System.out.println("方法名"+Modifier.toString(m.getModifiers())+"-"+m.getName());
}
//获取类的属性信息,getDeclaredFields()获取私有
Field[] fs=personClass.getFields();//公有属性,Person没有
for (Field f : fs) {
System.out.println("属性名:"+f.getName());
}
System.out.println("---------调用方法--------");
try {
Method m=personClass4.getMethod("setName", String.class);
m.invoke(p4, "花花");
System.out.println(p4);
//如果调用私有方法say
Method m1=personClass4.getDeclaredMethod("say");//注意可以调私有方法的方法
m1.setAccessible(true);//忽略验证修饰符,让其对外可见
m1.invoke(p4);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("---------调用属性--------");
Field agef=personClass4.getDeclaredField("age");
agef.setAccessible(true);//忽略验证修饰符
System.out.println(agef.get(p4));//获得p4的年龄
agef.setInt(p4, 11);//设置p4的年龄值
System.out.println(p4);
}
}

java学习之反射的更多相关文章

  1. java学习之反射机制

    java语言区别于C,C++等准静态语言的最大特点就是java的反射机制.静态语言的最直接定义就是不能在运行时改变程序结构或变量的类型.按照这样的定义,python,ruby是动态语言,C,C++,J ...

  2. Java学习之反射篇

    Java学习之反射篇 0x00 前言 今天简单来记录一下,反射与注解的一些东西,反射这个机制对于后面的java反序列化漏洞研究和代码审计也是比较重要. 0x01 反射机制概述 Java反射是Java非 ...

  3. java学习之 反射

    以前学习java只是学习了基本语法操作,各种常用方法的使用,随着慢慢学习,很多大神都觉得要想成为大神,就必须把java的反射给理解透,这样我就带着好奇的心去学习到底反射是什么玩意,所以就上网找资料学习 ...

  4. java学习--Reflection反射机制

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...

  5. Java学习笔记--反射

    什么是Java反射 概念 java反射是指java能够在运行时确定类的类型信息,包括其方法.字段.构造函数等,并能够通过反射调用类或者类对象的方法.在Java中,java.lang.Class类与ja ...

  6. 4 Java学习之 反射Reflection

    1. 反射概念  反射机制就是:动态地获取类的一切信息,并利用这些信息做一些你想做的事情. java反射机制能够知道类名而不实例化对象的状态下,获得对象的属性或调用方法. JAVA反射机制是在运行状态 ...

  7. Java学习:反射机制简介

    反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为ja ...

  8. Java学习_反射

    什么是反射? 反射就是Reflection,Java的反射是指程序在运行期可以拿到一个对象的所有信息. 反射是为了解决在运行期,对某个实例一无所知的情况下,如何调用其方法. JAVA反射机制是在运行状 ...

  9. Java学习之反射机制及应用场景

    前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...

  10. 0034 Java学习笔记-反射-初步2-操作对象

    通过反射创建对象 通过反射创建对象有两种方式,一种通过Class对象的newInstance()方法,一种是获取到Class对象的Constructor后,再调用newInstance()方法,前者要 ...

随机推荐

  1. linux下coredump的产生及调试方法

    什么是coredump 通常情况下coredmp包括了程序执行时的内存,寄存器状态,堆栈指针,内存管理信息等.能够理解为把程序工作的当前状态存储成一个文件.很多程序和操作系统出错时会自己主动生成一个c ...

  2. 不是技术牛人,如何拿到国内IT巨头的Offer(1)

    转自:http://developer.51cto.com/art/201404/436685.htm 不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些牛人,N ...

  3. 用css3画企鹅

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta na ...

  4. 多个viewpager可能产生的问题

    由于Fragment的方便性,现在很多人开始大量使用Fragment. 今天使用时遇到各问题,记录下来并分享下. 使用Fragment都会用FragmentActivity ,特别是在用到ViewPa ...

  5. 关于$.ajax的请求格式

    1 $.ajax({ 2 url: "http://localhost:5311/UserService.asmx/GetLoginId",//请求的URL 3 type: &qu ...

  6. C#指定目录存放DLL

    C#开发中,常常会用到不少扩展库,把这些扩展库的大量DLL放在软件目录下面,非常不美观. 通过设置自定义的DLL存放目录,可以把DLL存在指定的目录下面. 代码如下: <?xml version ...

  7. Android 开发笔记“Application 理解”

    Android 中Application类用法 1.             Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时 ...

  8. Oracle的大数据类型,BIG DATA TYPE

    1.CLOB 字符LOB类型,主要用于存储大型英文字符 2.NCLOB 国际语言字符LOB类型,主要用于存储大型非英文字符 3.BLOB 二进制LOB类型,主要用于存储二进制数据 4.BFILE 二进 ...

  9. bzoj 4373: 算术天才⑨与等差数列 hash

    题目链接 题目大意:  给你n个数, 给两种操作, 一种给你l, r, k,问你[l, r]区间里的数排序后能否构成一个公差为k的等差数列. 另一种是将位置x的数变为y. 强制在线. 可以用hash来 ...

  10. 转: css3动画简介以及动画库animate.css的使用

    ~~~ transition  animation 和 animate.css 在这个年代,你要是不懂一点点css3的知识,你都不好意思说你是个美工.美你妹啊,请叫我前端工程师好不好.呃..好吧,攻城 ...