内部类
public class MemberInnerClass {
public static void main(String[] args) {
MemberInnerClass mic= new MemberInnerClass();
mic.outerShow();
}
private int outerVariable = 1;
private int commonVariable = 2;
private static int outerStaticVariable = 3;
//省略getter/setter
/**
* 成员方法
*/
public void outerMethod() {
System.out.println("我是外部类的outerMethod方法");
}
/**
* 静态方法
*/
public static void outerStaticMethod() {
System.out.println("我是外部类的outerStaticMethod静态方法");
}
/**
* 内部类
*/
public class Inner {
public String paramA;
public String getParamA() {
return paramA;
}
public void setParamA(String paramA) {
this.paramA = paramA;
}
public int getParamB() {
return paramB;
}
public void setParamB(int paramB) {
this.paramB = paramB;
}
public int paramB;
private int commonVariable = 20;
/**
* 构造方法
*/
public Inner() {
}
/**
* 成员方法,访问外部类信息(属性、方法)
*/
public void innerShow() {
//当和外部类冲突时,直接引用属性名,是内部类的成员属性
System.out.println("内部的commonVariable:" + commonVariable);
//内部类访问外部属性
System.out.println("outerVariable:" + outerVariable);
//当和外部类属性名重叠时,可通过外部类名.this.属性名
System.out.println("外部的commonVariable:" + MemberInnerClass.this.commonVariable);
System.out.println("outerStaticVariable:" + outerStaticVariable);
//访问外部类的方法
outerMethod();
outerStaticMethod();
}
}
/**
* 外部类访问内部类信息
*/
public void outerShow() {
Inner inner = new Inner();
inner.paramA="字符串";
inner.paramB = 100;
System.out.println("内部类属性String:"+inner.paramA);
System.out.println("内部类属性Int:"+String.valueOf(inner.paramB));
inner.innerShow();
}
}
调用MemberInnerClass运行main的输出结果:
外部类调用+Java反射机制给内部类属性赋值
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class OtherClass {
public static void main(String[] args) {
memberinnerClass();
}
static void memberinnerClass(){
MemberInnerClass mic = new MemberInnerClass();
MemberInnerClass.Inner micinner= mic.new Inner();
Field[] field = micinner.getClass().getDeclaredFields();
for(Field s:field){
s.setAccessible(true);
if(s.getName().equals("paramA")){
try {
/* String methname = s.getName().substring(0,1).toUpperCase()+s.getName().substring(1);
Method m = micinner.getClass().getMethod("set" + methname, (Class<?>) s.getGenericType());
m.invoke(micinner,"qqqqqq");*/
s.set(micinner,"qqqqqq");
Object getss = s.get(micinner);
String a="lll";
System.out.println("//"+getss.toString());
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
micinner.innerShow();
}
}
外部类调用运行结果:
报错点:
1:IllegalAccessException :Object getss = s.get(micinner);
原因:get内部参数是反射的对象的引用,是object类型,不是对象内的属性值。
2:NoSuchMethods:Method m = micinner.getClass().getMethod("set" + methname, (Class<?>) s.getGenericType());
原因:"set" + methname 方法在对象中要存在,存在get,set方法,不是新建方法,是调用。第二个参数是给属性赋值属性的类型。
总结:
- 可以是任何的访问修饰符。
- 内部类的内部不能有静态信息。
- 内部类也是类,该继承继承,该重写重写,该重载重载,this和super随便用。
- 外部类如何访问内部类信息,必须new之后打点访问。
- 内部类可以直接使用外部类的任何信息,如果属性或者方法发生冲突,调用外部类.this.属性或者方法。
- s.setAccessible(true);反射的能访问类中私有的属性和方法。