Java反射(1)
来源:互联网 发布:aimbooster for mac 编辑:程序博客网 时间:2024/06/05 01:52
Java反射
1.实例化Class类对象的方法有三种:
⑴. 通过forName()方法
⑵. 类.class;
⑶. 对象.getClass();
代码:
package com.test;public class Test_Class {public static void main ( String [] args ) {A a = new A(); //实例化对象System.out.println(a.getClass());System.out.println(a.getClass().getName());System.out.println(A.class);try {System.out.println(Class.forName("com.test.A"));} catch (ClassNotFoundException e) {e.printStackTrace();}}}class A{}
结果:
class com.test.Acom.test.Aclass com.test.Aclass com.test.A
一旦实例化对象后可以更进一步的进行操作
例如:
package com.test;public class Test_Class {public static void main ( String [] args ) {try {A a = null ; //声明对象Class<?> c = (Class) Class.forName("com.test.A"); // 得到 //A a = (A) Class.forName("com.test.A");因为返回的是一个Object类型 所以向下转型System.out.println(c.getClass().getName()); //输出类名a = (A)c.newInstance(); //实例化对象a.setAge(10);a.setName("test");System.out.println(a);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}}class A{private String name ;private int age ;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 String toString(){return "姓名 : " + this.name + " 年龄: " + this.age ;}}
结果:
class com.test.A姓名 : test 年龄: 10
以上代码可以发现 如果不使用关键字new 也可以实例化一个对象并且必须包含一个无参构造方法 否则无法被实例化.
自己看了源码
import java.lang.reflect.InvocationTargetException; /** This interface provides the declaration for java.lang.reflect.Constructor.invoke(). Each Constructor object is configured with a (possibly dynamically-generated) class which implements this interface. *//** Matches specification in {@link java.lang.reflect.Constructor} *//**大概意思是说此接口提供了java.lang.reflect.Constructor.invoke()的声明。每个构造的对象有可能是动态生成的类,它实现了这个接口。并且符合*java.lang.reflect.Constructor规范*/public interface ConstructorAccessor { public Object newInstance(Object[] args) throws InstantiationException, IllegalArgumentException, InvocationTargetException; }如果必须使用有参构造函数的话可以.1.通过Class类中getConstructors()方法取得本类中全部的构造函数.
2.想构造方法传递一个一个对象数组进去 里面包含了构造方法中所需的各个参数
3之后通过Constructor实例化对象
Constructor表示构造函数类
一般建议类中包含一个无参构造函数.
java.lang.reflect包中的常用类
1. Constructor 表示类中的构造函数
getModifiers(); 取得修饰符
getName(); 取得方法名
getParamenterTypes() 取得参数的类型
2. Field 表示类中的属性
3. Mehtod 表示类中的方法
这三个类都是 AccessibleObject类的子类
代码:
package com.test;import java.lang.reflect.Constructor;public class Test_Constructor {public static void main ( String [] args ) {try {//实例化对象Class<?> c = Class.forName("com.test.TestUserImpl");//取得类全部实现的接口Class [] c1 = c.getInterfaces();//取得类所继承的父类Class<?> c2 = c.getSuperclass();//取得类中的全部构造方法Constructor<?>[] con = c.getConstructors();for ( int i = 0 ; i < c1.length ; i++ ){System.out.println(c + " 类全部实现的接口 : " + c1[i]);}System.out.println( c + " 类所继承的父类 : " + c2);System.out.println("-----------------------------------------------------------");for( int i = 0 ; i < con.length ; i++ ){//得到构造方法中的参数类型Class<?>[] c4 = con[i].getParameterTypes();System.out.println( c + " 构造方法 :" + con[i]);System.out.println( c + " 构造方法修饰符 :" + con[i].getModifiers());System.out.println( c + " 方法名 :" + con[i].getName());for ( int j = 0 ; j < c4.length ; j++ ){System.out.println( c + " 参数类型 :" + c4[j].getName());}if ( i < con.length -1 ){System.out.println("-----------------------------------------------------------");}}} catch (ClassNotFoundException e) { e.printStackTrace();}}}interface ITestUser{public static final String uname = "rock";public static final int upass = 123;public void sayTest();public String test(String s1 , String s2 );}class TestUserImpl implements ITestUser{private String sex ;private String tel ;public TestUserImpl(){}public TestUserImpl( String sex ){this.sex = sex ;}public TestUserImpl( String sex , String tel ){this(sex) ;this.tel = tel ;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getTel() {return tel;}public void setTel(String tel) {this.tel = tel;}@Overridepublic void sayTest() {// TODO Auto-generated method stubSystem.out.println("名字 : " + this.uname + " 密码: " + this.upass);}@Overridepublic String test(String sex, String tel) {return "性别 : " + sex + " 电话: " + tel ;}}
结果:class com.test.TestUserImpl 类全部实现的接口 : interface com.test.ITestUserclass com.test.TestUserImpl 类所继承的父类 : class java.lang.Object-----------------------------------------------------------class com.test.TestUserImpl 构造方法 :public com.test.TestUserImpl()class com.test.TestUserImpl 构造方法修饰符 :1class com.test.TestUserImpl 方法名 :com.test.TestUserImpl-----------------------------------------------------------class com.test.TestUserImpl 构造方法 :public com.test.TestUserImpl(java.lang.String,java.lang.String)class com.test.TestUserImpl 构造方法修饰符 :1class com.test.TestUserImpl 方法名 :com.test.TestUserImplclass com.test.TestUserImpl 参数类型 :java.lang.Stringclass com.test.TestUserImpl 参数类型 :java.lang.String-----------------------------------------------------------class com.test.TestUserImpl 构造方法 :public com.test.TestUserImpl(java.lang.String)class com.test.TestUserImpl 构造方法修饰符 :1class com.test.TestUserImpl 方法名 :com.test.TestUserImplclass com.test.TestUserImpl 参数类型 :java.lang.String //看 class com.test.TestUserImpl 构造方法修饰符 :1 得到的却是一个数字 因为java修饰符在底层是用数字表示的//如果想把他换成我们看得懂的关键字 则必须使用Modifier类的toString(int mod);方法// 修改代码:int h = c4[j].getModifiers(); System.out.println("转换后的权限 : " + Modifier.toString(h));//结果为: 转换后的权限 : public final
- Java反射1
- java反射1
- Java反射笔记1
- Java反射(1)
- 说一说java反射(1)
- Java 反射reflex(1)
- java 反射总结1
- java反射(1)
- JAVA 反射1
- java反射详解(1)
- java 反射1
- Java反射 1
- 【Java】反射机制1
- Java中的反射(1)
- java 反射1 Class
- Java反射专题1
- java反射笔记1
- [java]反射1
- 人人授权跳转问题
- 再论:如何解Bug
- ACE:条件类属(Condition)
- 认知失调
- javascript 中文转拼音代码
- Java反射(1)
- Solaris下启动java程序,shell编程
- 本杰明•富兰克林效应
- c语言 union与大端小端
- Unable to open the service ‘tomcat6’
- Oracle卸载
- 一个很棒的类似 Facebook 风格的 TextboxList
- 可可肉>>思成败>>耐心&&性情
- 对session和cookie的一些理解