java 反射机制

1.测试类如下:

Person.java:

package com.fill.jdbc;


public class Person {

private int age;

private String name;

private String sex;

public String ss;

public int getAge() {

returnage;

}

public void setAge(intage) {

this.age =age;

}

public Person(intage, String name, Stringsex) {

super();

this.age =age;

this.name =name;

this.sex =sex;

System.out.println("有参方法");

}

private void sy(){

System.out.println("测试私有");

}

public Person(){

System.out.println("无参方法");

}

public String getName() {

returnname;

}

public void setName(Stringname) {

this.name =name;

}

public String getSex() {

eturnsex;

}

public void setSex(Stringsex) {

this.sex =sex;

}


}

2.利用反射来获取类的信息

ReflectionDemo.php

package com.fill.jdbc;


import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;



public class ReflectionDemo {

/*

*得到Class类的对象有三种方式

*a.Object类中的getClass方法

*b.类.class

*c.Class类的forName方法 

*/

public staticvoid main(String[] args) {

constru_class();

}

public static void iniclass(){

// TODO Auto-generated method stub

Person p1=new Person(16,"小丽","女");

Person p=new Person(18,"小娟","女");

//一个Class对象代表一份字节码,相同类型的对象得到的字节码对象是同一个

//创建Class对象方式1

Class personClass=p1.getClass();

Class personClass2=p.getClass();

System.out.println(personClass==personClass2);

//返回的是true;因为是getClass出来是同一个对象

//b.类.class

Class personClass3=Person.class;

System.out.println(personClass==personClass3);

//也是true;

//Class类的forName方法 

try {

ClasspersonClass4=Class.forName("com.fill.jdbc.Person");

} catch (ClassNotFoundExceptione) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public staticvoid constru_class(){

/*

* 使用Class类进行对象的实例化操作

* a.调用无参构造进行实例化

* b.调用有参构造进行实例化

*/

try {

ClasspersonClass4=Class.forName("com.fill.jdbc.Person");

//a.无参构造=》如果类中没有无参构造方法,会报异常

Person p3=(Person)personClass4.newInstance();

//获取所有构造方法

Constructor[]cs=personClass4.getConstructors();

//b.有参构造

/*

for(Constructor c:cs){

//打印出构造方法名称

System.out.println(c.getName());

Class[] paramTypes=c.getParameterTypes();

for(Class class1:paramTypes){

System.out.println(class1);

}

}

*/

try {

Constructorc1=personClass4.getConstructor(int.class,String.class,String.class);

Person p4=(Person)c1.newInstance(23,"玉玉","女");

/*

System.out.println(p4.getAge());

//a.根据反射获取类信息

System.out.println("包信息:"+personClass4.getPackage());

System.out.println("类名:"+personClass4.getName());

//获取所有方法(父类,超类的所有公共方法)

Method[] methods=personClass4.getMethods();

for(int i=0;i<methods.length;i++){

Method m=methods[i];

System.out.println("类名:"+m.getName()+"=="+m.getReturnType());

}

System.out.println("=========");

//获取所有(包括私有不包括继承);

Method[] me=personClass4.getDeclaredMethods();

for(int i=0;i<me.length;i++){

Method m=me[i];

System.out.println("类名:"+m.getName()+"=="+m.getReturnType());

}

System.out.println(">>>>>>>>>");

//获取属性=>公有

Field[] fie=personClass4.getFields();

for(int i=0;i<fie.length;i++){

Field m=fie[i];

System.out.println(m.getName());

}

*/

//调用属性和方法(invoke)

Method m4=personClass4.getMethod("setName", String.class);

//调用方法

//表示在p4的对象上调用这个setName方法==p4.setName("粉粉");

m4.invoke(p4,"粉粉");

System.out.println(p4.getName());

//下面开始调私有方法

Method sy=personClass4.getDeclaredMethod("sy");

sy.setAccessible(true);//忽略检查访问修饰符,设置为能访问

sy.invoke(p4);

//下面调用属性(私有和公有)

Field namefield=personClass4.getDeclaredField("name");

namefield.setAccessible(true);

System.out.println(namefield.get(p4));//获取p4的name属性

} catch (NoSuchMethodExceptione) {

//TODO Auto-generated catch block

e.printStackTrace();

} catch (SecurityExceptione) {

//TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalArgumentExceptione) {

//TODO Auto-generated catch block

e.printStackTrace();

} catch (InvocationTargetExceptione) {

//TODO Auto-generated catch block

e.printStackTrace();

}catch (NoSuchFieldExceptione) {

//TODO Auto-generated catch block

e.printStackTrace();

}

//通过Class类获取类信息

//eg a:取得类所在包 b.取得一个类中全部方法 c.取得一个类中全部属性


} catch (ClassNotFoundExceptione) {

// TODO Auto-generated catch block

e.printStackTrace();

}catch (InstantiationExceptione) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalAccessExceptione) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}


}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值